From 0049202353afceee32ddbc5919596aad32d2391a Mon Sep 17 00:00:00 2001 From: kobenguyent Date: Tue, 7 Nov 2023 14:35:31 +0100 Subject: [PATCH 1/2] feat(playwright): support HAR recording --- docs/helpers/Playwright.md | 14 ++++++++++++ lib/helper/Playwright.js | 41 +++++++++++++++++++++++++++++++++- test/helper/Playwright_test.js | 12 ++++++---- 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/docs/helpers/Playwright.md b/docs/helpers/Playwright.md index bf5db3a10..b7c9a159d 100644 --- a/docs/helpers/Playwright.md +++ b/docs/helpers/Playwright.md @@ -79,6 +79,7 @@ Type: [object][5] - `ignoreHTTPSErrors` **[boolean][25]?** Allows access to untrustworthy pages, e.g. to a page with an expired certificate. Default value is `false` - `bypassCSP` **[boolean][25]?** bypass Content Security Policy or CSP - `highlightElement` **[boolean][25]?** highlight the interacting elements. Default: false. Note: only activate under verbose mode (--verbose). +- `har` **{recordMode: `"minimal"`, content: `"embed"`}?** HAR recording. See more in HAR Recording Customization section. @@ -99,6 +100,19 @@ Traces will be saved to `output/trace` - `trace`: enables trace recording for failed tests; trace are saved into `output/trace` folder - `keepTraceForPassedTests`: - save trace for passed tests +#### HAR Recording Customization + +A HAR file is an HTTP Archive file that contains a record of all the network requests that are made when a page is loaded. +It contains information about the request and response headers, cookies, content, timings, and more. You can use HAR files to mock network requests in your tests. +HAR will be saved to `output/har` + + ... + har: { + recordMode: 'minimal', // possible value: 'minimal', 'full'. Ref: https://playwright.dev/docs/api/class-page#page-route-from-har-option-update-mode + content: 'embed' // possible value: 'embed', 'attach'. Ref: https://playwright.dev/docs/api/class-page#page-route-from-har-option-update-content + } + ... + #### Example #1: Wait for 0 network connections. ```js diff --git a/lib/helper/Playwright.js b/lib/helper/Playwright.js index 3708a808d..64a1aaccb 100644 --- a/lib/helper/Playwright.js +++ b/lib/helper/Playwright.js @@ -94,6 +94,7 @@ const pathSeparator = path.sep; * @prop {boolean} [ignoreHTTPSErrors] - Allows access to untrustworthy pages, e.g. to a page with an expired certificate. Default value is `false` * @prop {boolean} [bypassCSP] - bypass Content Security Policy or CSP * @prop {boolean} [highlightElement] - highlight the interacting elements. Default: false. Note: only activate under verbose mode (--verbose). + * @prop {{ recordMode: 'minimal', content: 'embed' }} [har] - HAR recording. See more in HAR Recording Customization section. */ const config = {}; @@ -141,6 +142,21 @@ const config = {}; * * `trace`: enables trace recording for failed tests; trace are saved into `output/trace` folder * * `keepTraceForPassedTests`: - save trace for passed tests * + * #### HAR Recording Customization + * + * A HAR file is an HTTP Archive file that contains a record of all the network requests that are made when a page is loaded. + * It contains information about the request and response headers, cookies, content, timings, and more. You can use HAR files to mock network requests in your tests. + * HAR will be saved to `output/har` + * + * ``` + * ... + * har: { + * recordMode: 'minimal', // possible value: 'minimal', 'full'. Ref: https://playwright.dev/docs/api/class-page#page-route-from-har-option-update-mode + * content: 'embed' // possible value: 'embed', 'attach'. Ref: https://playwright.dev/docs/api/class-page#page-route-from-har-option-update-content + * } + * ... + *``` + * * #### Example #1: Wait for 0 network connections. * * ```js @@ -455,7 +471,8 @@ class Playwright extends Helper { } } - async _before() { + async _before(test) { + this.currentRunningTest = test; recorder.retry({ retries: 5, when: err => { @@ -834,6 +851,7 @@ class Playwright extends Helper { this.context = null; this.frame = null; popupStore.clear(); + if (this.options.har) await this.browserContext.close(); await this.browser.close(); } @@ -903,6 +921,19 @@ class Playwright extends Helper { } } + if (this.options.har) { + const harExt = this.options.har.content && this.options.har.content === 'attach' ? 'zip' : 'har'; + const fileName = `${`${global.output_dir}${path.sep}har${path.sep}${uuidv4()}_${clearString(this.currentRunningTest.title)}`.slice(0, 245)}.${harExt}`; + const dir = path.dirname(fileName); + if (!fileExists(dir)) fs.mkdirSync(dir); + await this.page.routeFromHAR(fileName, { + update: true, + updateMode: this.options.har.recordMode || 'minimal', + updateContent: this.options.har.content || 'embed', + }); + this.currentRunningTest.artifacts.har = fileName; + } + await this.page.goto(url, { waitUntil: this.options.waitForNavigation }); const performanceTiming = JSON.parse(await this.page.evaluate(() => JSON.stringify(window.performance.timing))); @@ -2262,6 +2293,10 @@ class Playwright extends Helper { test.artifacts[`trace_${sessionName}`] = await saveTraceForContext(this.sessionPages[sessionName].context, `${test.title}_${sessionName}.failed`); } } + + if (this.options.har) { + test.artifacts.har = this.currentRunningTest.artifacts.har; + } } async _passed(test) { @@ -2289,6 +2324,10 @@ class Playwright extends Helper { await this.browserContext.tracing.stop(); } } + + if (this.options.har) { + test.artifacts.har = this.currentRunningTest.artifacts.har; + } } /** diff --git a/test/helper/Playwright_test.js b/test/helper/Playwright_test.js index c490b4b45..bbeca626c 100644 --- a/test/helper/Playwright_test.js +++ b/test/helper/Playwright_test.js @@ -1527,7 +1527,9 @@ describe('Playwright - Performance Metrics', () => { }); }); -describe('Playwright - Video & Trace', () => { +describe('Playwright - Video & Trace & HAR', () => { + const test = { title: 'a failed test', artifacts: {} }; + before(() => { global.codecept_dir = path.join(__dirname, '/../data'); global.output_dir = path.join(`${__dirname}/../data/output`); @@ -1540,6 +1542,7 @@ describe('Playwright - Video & Trace', () => { browser: 'chromium', trace: true, video: true, + har: {}, }); I._init(); return I._beforeSuite(); @@ -1551,7 +1554,8 @@ describe('Playwright - Video & Trace', () => { }); deleteDir(path.join(global.output_dir, 'video')); deleteDir(path.join(global.output_dir, 'trace')); - return I._before().then(() => { + deleteDir(path.join(global.output_dir, 'har')); + return I._before(test).then(() => { page = I.page; browser = I.browser; }); @@ -1562,19 +1566,19 @@ describe('Playwright - Video & Trace', () => { }); it('checks that video is recorded', async () => { - const test = { title: 'a failed test', artifacts: {} }; await I.amOnPage('/'); await I.dontSee('this should be an error'); await I.click('More info'); await I.dontSee('this should be an error'); await I._failed(test); assert(test.artifacts); - // expect(Object.keys(test.artifacts).length).should.eq(2); expect(Object.keys(test.artifacts)).to.include('trace'); expect(Object.keys(test.artifacts)).to.include('video'); + expect(Object.keys(test.artifacts)).to.include('har'); assert.ok(fs.existsSync(test.artifacts.trace)); expect(test.artifacts.video).to.include(path.join(global.output_dir, 'video')); expect(test.artifacts.trace).to.include(path.join(global.output_dir, 'trace')); + expect(test.artifacts.har).to.include(path.join(global.output_dir, 'har')); }); }); From 016deaec125a5f04dfc50ee2b25634c7d58279ee Mon Sep 17 00:00:00 2001 From: kobenguyent Date: Tue, 7 Nov 2023 15:13:37 +0100 Subject: [PATCH 2/2] feat(playwright): support HAR recording --- docs/helpers/Playwright.md | 754 +++++++++++++++++---------------- lib/helper/Playwright.js | 38 +- test/helper/Playwright_test.js | 2 +- 3 files changed, 396 insertions(+), 398 deletions(-) diff --git a/docs/helpers/Playwright.md b/docs/helpers/Playwright.md index b7c9a159d..da212d11a 100644 --- a/docs/helpers/Playwright.md +++ b/docs/helpers/Playwright.md @@ -39,47 +39,47 @@ Using playwright-core package, will prevent the download of browser binaries and This helper should be configured in codecept.conf.(js|ts) -Type: [object][5] +Type: [object][6] ### Properties -- `url` **[string][8]?** base url of website to be tested +- `url` **[string][9]?** base url of website to be tested - `browser` **(`"chromium"` | `"firefox"` | `"webkit"` | `"electron"`)?** a browser to test on, either: `chromium`, `firefox`, `webkit`, `electron`. Default: chromium. -- `show` **[boolean][25]?** show browser window. -- `restart` **([string][8] | [boolean][25])?** restart strategy between tests. Possible values:- 'context' or **false** - restarts [browser context][42] but keeps running browser. Recommended by Playwright team to keep tests isolated. +- `show` **[boolean][26]?** show browser window. +- `restart` **([string][9] | [boolean][26])?** restart strategy between tests. Possible values:- 'context' or **false** - restarts [browser context][43] but keeps running browser. Recommended by Playwright team to keep tests isolated. - 'browser' or **true** - closes browser and opens it again between tests. - 'session' or 'keep' - keeps browser context and session, but cleans up cookies and localStorage between tests. The fastest option when running tests in windowed mode. Works with `keepCookies` and `keepBrowserState` options. This behavior was default before CodeceptJS 3.1 -- `timeout` **[number][20]?** - [timeout][43] in ms of all Playwright actions . -- `disableScreenshots` **[boolean][25]?** don't save screenshot on failure. +- `timeout` **[number][21]?** - [timeout][44] in ms of all Playwright actions . +- `disableScreenshots` **[boolean][26]?** don't save screenshot on failure. - `emulate` **any?** browser in device emulation mode. -- `video` **[boolean][25]?** enables video recording for failed tests; videos are saved into `output/videos` folder -- `keepVideoForPassedTests` **[boolean][25]?** save videos for passed tests; videos are saved into `output/videos` folder -- `trace` **[boolean][25]?** record [tracing information][44] with screenshots and snapshots. -- `keepTraceForPassedTests` **[boolean][25]?** save trace for passed tests. -- `fullPageScreenshots` **[boolean][25]?** make full page screenshots on failure. -- `uniqueScreenshotNames` **[boolean][25]?** option to prevent screenshot override if you have scenarios with the same name in different suites. -- `keepBrowserState` **[boolean][25]?** keep browser state between tests when `restart` is set to 'session'. -- `keepCookies` **[boolean][25]?** keep cookies between tests when `restart` is set to 'session'. -- `waitForAction` **[number][20]?** how long to wait after click, doubleClick or PressKey actions in ms. Default: 100. -- `waitForNavigation` **(`"load"` | `"domcontentloaded"` | `"commit"`)?** When to consider navigation succeeded. Possible options: `load`, `domcontentloaded`, `commit`. Choose one of those options is possible. See [Playwright API][40]. -- `pressKeyDelay` **[number][20]?** Delay between key presses in ms. Used when calling Playwrights page.type(...) in fillField/appendField -- `getPageTimeout` **[number][20]?** config option to set maximum navigation time in milliseconds. -- `waitForTimeout` **[number][20]?** default wait* timeout in ms. Default: 1000. -- `basicAuth` **[object][5]?** the basic authentication to pass to base url. Example: {username: 'username', password: 'password'} -- `windowSize` **[string][8]?** default window size. Set a dimension like `640x480`. +- `video` **[boolean][26]?** enables video recording for failed tests; videos are saved into `output/videos` folder +- `keepVideoForPassedTests` **[boolean][26]?** save videos for passed tests; videos are saved into `output/videos` folder +- `trace` **[boolean][26]?** record [tracing information][45] with screenshots and snapshots. +- `keepTraceForPassedTests` **[boolean][26]?** save trace for passed tests. +- `fullPageScreenshots` **[boolean][26]?** make full page screenshots on failure. +- `uniqueScreenshotNames` **[boolean][26]?** option to prevent screenshot override if you have scenarios with the same name in different suites. +- `keepBrowserState` **[boolean][26]?** keep browser state between tests when `restart` is set to 'session'. +- `keepCookies` **[boolean][26]?** keep cookies between tests when `restart` is set to 'session'. +- `waitForAction` **[number][21]?** how long to wait after click, doubleClick or PressKey actions in ms. Default: 100. +- `waitForNavigation` **(`"load"` | `"domcontentloaded"` | `"commit"`)?** When to consider navigation succeeded. Possible options: `load`, `domcontentloaded`, `commit`. Choose one of those options is possible. See [Playwright API][41]. +- `pressKeyDelay` **[number][21]?** Delay between key presses in ms. Used when calling Playwrights page.type(...) in fillField/appendField +- `getPageTimeout` **[number][21]?** config option to set maximum navigation time in milliseconds. +- `waitForTimeout` **[number][21]?** default wait* timeout in ms. Default: 1000. +- `basicAuth` **[object][6]?** the basic authentication to pass to base url. Example: {username: 'username', password: 'password'} +- `windowSize` **[string][9]?** default window size. Set a dimension like `640x480`. - `colorScheme` **(`"dark"` | `"light"` | `"no-preference"`)?** default color scheme. Possible values: `dark` | `light` | `no-preference`. -- `userAgent` **[string][8]?** user-agent string. -- `locale` **[string][8]?** locale string. Example: 'en-GB', 'de-DE', 'fr-FR', ... -- `manualStart` **[boolean][25]?** do not start browser before a test, start it manually inside a helper with `this.helpers["Playwright"]._startBrowser()`. -- `chromium` **[object][5]?** pass additional chromium options -- `firefox` **[object][5]?** pass additional firefox options -- `electron` **[object][5]?** (pass additional electron options -- `channel` **any?** (While Playwright can operate against the stock Google Chrome and Microsoft Edge browsers available on the machine. In particular, current Playwright version will support Stable and Beta channels of these browsers. See [Google Chrome & Microsoft Edge][45]. -- `ignoreLog` **[Array][10]<[string][8]>?** An array with console message types that are not logged to debug log. Default value is `['warning', 'log']`. E.g. you can set `[]` to log all messages. See all possible [values][46]. -- `ignoreHTTPSErrors` **[boolean][25]?** Allows access to untrustworthy pages, e.g. to a page with an expired certificate. Default value is `false` -- `bypassCSP` **[boolean][25]?** bypass Content Security Policy or CSP -- `highlightElement` **[boolean][25]?** highlight the interacting elements. Default: false. Note: only activate under verbose mode (--verbose). -- `har` **{recordMode: `"minimal"`, content: `"embed"`}?** HAR recording. See more in HAR Recording Customization section. +- `userAgent` **[string][9]?** user-agent string. +- `locale` **[string][9]?** locale string. Example: 'en-GB', 'de-DE', 'fr-FR', ... +- `manualStart` **[boolean][26]?** do not start browser before a test, start it manually inside a helper with `this.helpers["Playwright"]._startBrowser()`. +- `chromium` **[object][6]?** pass additional chromium options +- `firefox` **[object][6]?** pass additional firefox options +- `electron` **[object][6]?** (pass additional electron options +- `channel` **any?** (While Playwright can operate against the stock Google Chrome and Microsoft Edge browsers available on the machine. In particular, current Playwright version will support Stable and Beta channels of these browsers. See [Google Chrome & Microsoft Edge][46]. +- `ignoreLog` **[Array][11]<[string][9]>?** An array with console message types that are not logged to debug log. Default value is `['warning', 'log']`. E.g. you can set `[]` to log all messages. See all possible [values][47]. +- `ignoreHTTPSErrors` **[boolean][26]?** Allows access to untrustworthy pages, e.g. to a page with an expired certificate. Default value is `false` +- `bypassCSP` **[boolean][26]?** bypass Content Security Policy or CSP +- `highlightElement` **[boolean][26]?** highlight the interacting elements. Default: false. Note: only activate under verbose mode (--verbose). +- `recordHar` **[object][6]?** record HAR and will be saved to `output/har`. See more of [HAR options][3]. @@ -104,12 +104,12 @@ Traces will be saved to `output/trace` A HAR file is an HTTP Archive file that contains a record of all the network requests that are made when a page is loaded. It contains information about the request and response headers, cookies, content, timings, and more. You can use HAR files to mock network requests in your tests. -HAR will be saved to `output/har` +HAR will be saved to `output/har`. More info could be found here [https://playwright.dev/docs/api/class-browser#browser-new-context-option-record-har][3]. ... - har: { - recordMode: 'minimal', // possible value: 'minimal', 'full'. Ref: https://playwright.dev/docs/api/class-page#page-route-from-har-option-update-mode - content: 'embed' // possible value: 'embed', 'attach'. Ref: https://playwright.dev/docs/api/class-page#page-route-from-har-option-update-content + recordHar: { + mode: 'minimal', // possible values: 'minimal'|'full'. + content: 'embed' // possible values: "omit"|"embed"|"attach". } ... @@ -156,7 +156,7 @@ HAR will be saved to `output/har` } ``` -#### Example #4: Connect to remote browser by specifying [websocket endpoint][3] +#### Example #4: Connect to remote browser by specifying [websocket endpoint][4] ```js { @@ -174,7 +174,7 @@ HAR will be saved to `output/har` #### Example #5: Testing with Chromium extensions -[official docs][4] +[official docs][5] ```js { @@ -297,7 +297,7 @@ Usually it should be run from a custom helper after call of `_startBrowser()` #### Parameters -- `contextOptions` **[object][5]?** See [https://playwright.dev/docs/api/class-browser#browser-new-context][6] +- `contextOptions` **[object][6]?** See [https://playwright.dev/docs/api/class-browser#browser-new-context][7] ### _getPageUrl @@ -373,13 +373,13 @@ Set current page #### Parameters -- `page` **[object][5]** page to set +- `page` **[object][6]** page to set ### acceptPopup Accepts the active JavaScript native popup window, as created by window.alert|window.confirm|window.prompt. Don't confuse popups with modal windows, as created by [various -libraries][7]. +libraries][8]. ### amAcceptingPopups @@ -416,9 +416,9 @@ I.amOnPage('/login'); // opens a login page #### Parameters -- `url` **[string][8]** url path or global url. +- `url` **[string][9]** url path or global url. -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder ### appendField @@ -433,10 +433,10 @@ I.appendField('password', secret('123456')); #### Parameters -- `field` **([string][8] | [object][5])** located by label|name|CSS|XPath|strict locator -- `value` **[string][8]** text value to append. +- `field` **([string][9] | [object][6])** located by label|name|CSS|XPath|strict locator +- `value` **[string][9]** text value to append. -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder ### attachFile @@ -451,10 +451,10 @@ I.attachFile('form input[name=avatar]', 'data/avatar.jpg'); #### Parameters -- `locator` **([string][8] | [object][5])** field located by label|name|CSS|XPath|strict locator. -- `pathToFile` **[string][8]** local file path relative to codecept.conf.ts or codecept.conf.js config file. +- `locator` **([string][9] | [object][6])** field located by label|name|CSS|XPath|strict locator. +- `pathToFile` **[string][9]** local file path relative to codecept.conf.ts or codecept.conf.js config file. -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder ### blockTraffic @@ -475,12 +475,12 @@ I.blockTraffic(['http://example.com/css/style.css', 'http://example.com/css/*.cs #### Parameters -- `urls` **([string][8] | [Array][10] | [RegExp][11])** URL or a list of URLs to block . URL can contain * for wildcards. Example: [https://www.example.com**][12] to block all traffic for that domain. Regexp are also supported. +- `urls` **([string][9] | [Array][11] | [RegExp][12])** URL or a list of URLs to block . URL can contain * for wildcards. Example: [https://www.example.com**][13] to block all traffic for that domain. Regexp are also supported. ### blur Remove focus from a text input, button, etc. -Calls [blur][13] on the element. +Calls [blur][14] on the element. Examples: @@ -497,10 +497,10 @@ I.dontSee('#add-to-cart-btn'); #### Parameters -- `locator` **([string][8] | [object][5])** field located by label|name|CSS|XPath|strict locator. -- `options` **any?** Playwright only: [Additional options][14] for available options object as 2nd argument. +- `locator` **([string][9] | [object][6])** field located by label|name|CSS|XPath|strict locator. +- `options` **any?** Playwright only: [Additional options][15] for available options object as 2nd argument. -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder ### cancelPopup @@ -521,11 +521,11 @@ I.checkOption('agree', '//form'); #### Parameters -- `field` **([string][8] | [object][5])** checkbox located by label | name | CSS | XPath | strict locator. -- `context` **([string][8]? | [object][5])** (optional, `null` by default) element located by CSS | XPath | strict locator. +- `field` **([string][9] | [object][6])** checkbox located by label | name | CSS | XPath | strict locator. +- `context` **([string][9]? | [object][6])** (optional, `null` by default) element located by CSS | XPath | strict locator. - `options` -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder[Additional options][15] for check available as 3rd argument.Examples:```js +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder[Additional options][16] for check available as 3rd argument.Examples:```js // click on element at position I.checkOption('Agree', '.signup', { position: { x: 5, y: 5 } }) ```> ⚠️ To avoid flakiness, option `force: true` is set by default @@ -542,9 +542,9 @@ I.clearCookie('test'); #### Parameters -- `cookie` **[string][8]?** (optional, `null` by default) cookie name +- `cookie` **[string][9]?** (optional, `null` by default) cookie name -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder ### clearField @@ -559,12 +559,12 @@ I.clearField('.text-area') I.clearField('#submit', { force: true }) ``` -Use `force` to bypass the [actionability][16] checks. +Use `force` to bypass the [actionability][17] checks. #### Parameters -- `locator` **([string][8] | [object][5])** field located by label|name|CSS|XPath|strict locator. -- `options` **any?** [Additional options][17] for available options object as 2nd argument. +- `locator` **([string][9] | [object][6])** field located by label|name|CSS|XPath|strict locator. +- `options` **any?** [Additional options][18] for available options object as 2nd argument. ### click @@ -592,9 +592,9 @@ I.click({css: 'nav a.login'}); #### Parameters -- `locator` **([string][8] | [object][5])** clickable link or button located by text, or any element located by CSS|XPath|strict locator. -- `context` **([string][8]? | [object][5] | null)** (optional, `null` by default) element to search in CSS|XPath|Strict locator. -- `options` **any?** [Additional options][18] for click available as 3rd argument.Examples:```js +- `locator` **([string][9] | [object][6])** clickable link or button located by text, or any element located by CSS|XPath|strict locator. +- `context` **([string][9]? | [object][6] | null)** (optional, `null` by default) element to search in CSS|XPath|Strict locator. +- `options` **any?** [Additional options][19] for click available as 3rd argument.Examples:```js // click on element at position I.click('canvas', '.model', { position: { x: 20, y: 40 } }) @@ -602,7 +602,7 @@ I.click({css: 'nav a.login'}); I.click('.edit', null, { modifiers: ['Ctrl'] } ) ``` -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder ### clickLink @@ -641,10 +641,10 @@ I.dontSee('Login', '.nav'); // no login inside .nav element #### Parameters -- `text` **[string][8]** which is not present. -- `context` **([string][8] | [object][5])?** (optional) element located by CSS|XPath|strict locator in which to perfrom search. +- `text` **[string][9]** which is not present. +- `context` **([string][9] | [object][6])?** (optional) element located by CSS|XPath|strict locator in which to perfrom search. -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder ### dontSeeCheckboxIsChecked @@ -658,9 +658,9 @@ I.dontSeeCheckboxIsChecked('agree'); // located by name #### Parameters -- `field` **([string][8] | [object][5])** located by label|name|CSS|XPath|strict locator. +- `field` **([string][9] | [object][6])** located by label|name|CSS|XPath|strict locator. -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder ### dontSeeCookie @@ -672,9 +672,9 @@ I.dontSeeCookie('auth'); // no auth cookie #### Parameters -- `name` **[string][8]** cookie name. +- `name` **[string][9]** cookie name. -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder ### dontSeeCurrentUrlEquals @@ -688,9 +688,9 @@ I.dontSeeCurrentUrlEquals('http://mysite.com/login'); // absolute urls are also #### Parameters -- `url` **[string][8]** value to check. +- `url` **[string][9]** value to check. -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder ### dontSeeElement @@ -702,9 +702,9 @@ I.dontSeeElement('.modal'); // modal is not shown #### Parameters -- `locator` **([string][8] | [object][5])** located by CSS|XPath|Strict locator. +- `locator` **([string][9] | [object][6])** located by CSS|XPath|Strict locator. -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder ### dontSeeElementInDOM @@ -716,9 +716,9 @@ I.dontSeeElementInDOM('.nav'); // checks that element is not on page visible or #### Parameters -- `locator` **([string][8] | [object][5])** located by CSS|XPath|Strict locator. +- `locator` **([string][9] | [object][6])** located by CSS|XPath|Strict locator. -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder ### dontSeeInCurrentUrl @@ -726,9 +726,9 @@ Checks that current url does not contain a provided fragment. #### Parameters -- `url` **[string][8]** value to check. +- `url` **[string][9]** value to check. -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder ### dontSeeInField @@ -742,10 +742,10 @@ I.dontSeeInField({ css: 'form input.email' }, 'user@user.com'); // field by CSS #### Parameters -- `field` **([string][8] | [object][5])** located by label|name|CSS|XPath|strict locator. -- `value` **([string][8] | [object][5])** value to check. +- `field` **([string][9] | [object][6])** located by label|name|CSS|XPath|strict locator. +- `value` **([string][9] | [object][6])** value to check. -Returns **[Promise][9]<void>** automatically synchronized promise through #recorder +Returns **[Promise][10]<void>** automatically synchronized promise through #recorder ### dontSeeInSource @@ -758,9 +758,9 @@ I.dontSeeInSource('