{"__v":0,"_id":"56902c62741e9c0d00af2fcc","category":{"__v":60,"_id":"569002f19ebef90d0087289d","pages":["56900352769f210d00132595","5690047121fcf0190071d943","569004924719c119002ce654","569004ceb700ce0d002f4b94","569023e518c3920d00be8b37","569023f748df220d004ca215","5690240af7eb9a0d00f4465d","5690241b48df220d004ca217","5690243e48df220d004ca219","56902453741e9c0d00af2fb5","56902463efcc380d0043a5a1","5690247b18c3920d00be8b39","56902492f7eb9a0d00f4465f","569024a16c49d70d00f18075","569024b2efcc380d0043a5a3","569024cc48df220d004ca21b","569024ea18c3920d00be8b3b","5690258618c3920d00be8b3f","5690259bf7eb9a0d00f44662","569025b06c49d70d00f18077","569029b418c3920d00be8b43","569029d4f7eb9a0d00f44667","569029e8e056c80d00fdec58","569029fb48df220d004ca221","56902a1c18c3920d00be8b46","56902a45f7eb9a0d00f44669","56902a6be056c80d00fdec5a","56902a78f7eb9a0d00f4466b","56902a8848df220d004ca224","56902aa018c3920d00be8b4b","56902ace6c49d70d00f18085","56902ae0741e9c0d00af2fc6","56902aee48df220d004ca226","56902af8f7eb9a0d00f44674","56902b26efcc380d0043a5b1","56902b8148df220d004ca22a","56902ba918c3920d00be8b55","56902bb96c49d70d00f1808b","56902bc818c3920d00be8b57","56902bd518c3920d00be8b59","56902be218c3920d00be8b5b","56902bf66c49d70d00f1808e","56902c05e056c80d00fdec5d","56902c196c49d70d00f18090","56902c2648df220d004ca22d","56902c34f7eb9a0d00f44678","56902c5518c3920d00be8b5d","56902c62741e9c0d00af2fcc","56902cde48df220d004ca230","56902cea741e9c0d00af2fcf","56902d0ae056c80d00fdec60","56902d20efcc380d0043a5b4","56902d3448df220d004ca232","5696c3fbf9203821005fe2fb","5696c3fb9e2d000d00947ab0","5696c3fbf9203821005fe2fa","5697efee8d2a770d00d2fd17","569802611c4dc823005426c7","56a65c82b3ffe00d00156eaf","56f01f88332da41700f24b74"],"project":"568fde81b700ce0d002f4b43","version":"568fde82b700ce0d002f4b46","sync":{"url":"","isSync":false},"reference":false,"createdAt":"2016-01-08T18:41:53.562Z","from_sync":false,"order":1,"slug":"commands","title":"Commands"},"parentDoc":null,"project":"568fde81b700ce0d002f4b43","user":"568fffce769f210d0013258f","version":{"__v":23,"_id":"568fde82b700ce0d002f4b46","project":"568fde81b700ce0d002f4b43","createdAt":"2016-01-08T16:06:26.373Z","releaseDate":"2016-01-08T16:06:26.373Z","categories":["568fde82b700ce0d002f4b47","568ff0e504440a1700e4cbbd","569002f19ebef90d0087289d","569004f4769f210d00132599","5690056d9ebef90d008728a0","569005d394c5030d0028813a","5690067804440a1700e4cbe2","569137eb3c4f510d00ec9b92","56913815e56a790d008dbfe3","569138ba3c4f510d00ec9b93","5691392f3c4f510d00ec9b94","56913bbe72f2810d007e4cb0","56933b8d6ebadc0d005b71d2","56933b8d6ebadc0d005b71d3","569564facaa32519009c41e6","5696a319b6d61f0d00acfb40","5696a319a857080d0082e8e8","5697efe43503e40d0061f4d1","5697efe48d2a770d00d2fd16","569e9597ffccd10d00a05c59","56a7a1523d33bc2100793d5c","56a7a32ecf6d771700baeee8","56b8b0f7ddeb231700e69825"],"is_deprecated":false,"is_hidden":false,"is_beta":false,"is_stable":false,"codename":"bar","version_clean":"1.0.0","version":"1.0"},"updates":[],"next":{"pages":[],"description":""},"createdAt":"2016-01-08T21:38:42.922Z","link_external":false,"link_url":"","githubsync":"","sync_unique":"","hidden":false,"api":{"results":{"codes":[]},"settings":"","auth":"required","params":[],"url":""},"isReference":false,"order":63,"body":"`cy.then()` will yield you the current subject as the first argument.\n\n`cy.then()` is modeled identically to the way Promises work in JavaScript.  Whatever is returned from the callback function becomes the new subject, and will flow into the next command, with the exception of `null` and `undefined`.\n\nWhen `null` or `undefined` is returned by the callback function, the subject will not be modified and will instead carry over to the next command.\n\nJust like Promises, you can return any compatible \"thenable\" (anything that has a `.then()` interface) and Cypress will wait for that to resolve before continuing forward through the chain of commands.\n\n| | |\n|--- | --- |\n| **Returns** | the return of the callback function |\n| **Timeout** | `cy.then` will retry for the duration of the [`defaultCommandTimeout`](https://on.cypress.io/guides/configuration#section-timeouts) or the duration of the `timeout` specified in the command's [options](#section-options). |\n\n***\n\n# [cy.then( *function* )](#section-usage)\n\nYield the current subject as the first argument.\n\n***\n\n# Usage\n\n## The element `input` is yielded\n\n[block:code]\n{\n    \"codes\": [\n        {\n            \"code\": \"<form id=\\\"todos\\\">\\n  <input type=\\\"text\\\" class=\\\"addTodo\\\" />\\n</form>\\n\",\n            \"language\": \"html\"\n        }\n    ]\n}\n[/block]\n\n[block:code]\n{\n    \"codes\": [\n        {\n            \"code\": \"cy.get(\\\"form\\\").find(\\\"input\\\").then(function($input){\\n  // work with $input subject here\\n  // we can potentially use it within an assertion\\n  // or just call some methods on it and return a new subject\\n})\\n\",\n            \"language\": \"javascript\"\n        }\n    ]\n}\n[/block]\n\n***\n\n# Options\n\nPass in an options object to change the default behavior of `cy.then`.\n\n**[cy.click( *options*,  *function* )](#options-usage)**\n\nOption | Default | Notes\n--- | --- | ---\n`timeout` | [`defaultCommandTimeout`](https://on.cypress.io/guides/configuration#section-timeouts) | Total time to retry the click\n\n***\n\n# Usage\n\n## Assert explicitly about the subject `<li>`'s\n\n[block:code]\n{\n    \"codes\": [\n        {\n            \"code\": \"<div id=\\\"todos\\\">\\n  <li>Walk the dog</li>\\n  <li>Feed the cat</li>\\n  <li>Write JavaScript</li>\\n</div>\\n\",\n            \"language\": \"html\"\n        }\n    ]\n}\n[/block]\n\n[block:code]\n{\n    \"codes\": [\n        {\n            \"code\": \"cy.get(\\\"#todos li\\\").then(function($lis){\\n  expect($lis).to.have.length(3)\\n  expect($lis.eq(0)).to.contain(\\\"Walk the dog\\\")\\n  expect($lis.eq(1)).to.contain(\\\"Feed the cat\\\")\\n  expect($lis.eq(2)).to.contain(\\\"Write JavaScript\\\")\\n})\\n\",\n            \"language\": \"javascript\"\n        }\n    ]\n}\n[/block]\n\nNormally you'd use implicit subject assertions via [should](https://on.cypress.io/api/should) or [and](https://on.cypress.io/api/and), but it's sometimes it's more convenient to write explicit assertions about a given subject.\n\n[block:callout]\n{\n  \"type\": \"warning\",\n  \"body\": \"Any errors raised by failed assertions will immediately bubble up and cause the test to fail.\"\n}\n[/block]\n\n***\n\n## The subject is changed by returning `{foo: 'bar'}`\n\n[block:code]\n{\n    \"codes\": [\n        {\n            \"code\": \"cy.then(function(){\\n  return {foo: \\\"bar\\\"}\\n}).then(function(obj){\\n  // subject is now the obj {foo: \\\"bar\\\"}\\n  expect(obj).to.deep.eq({foo: \\\"bar\\\"}) // true\\n})\\n\",\n            \"language\": \"javascript\"\n        }\n    ]\n}\n[/block]\n\n***\n\n## Cypress waits for the Promise to resolve before continuing\n\n[block:code]\n{\n    \"codes\": [\n        {\n            \"code\": \"// if using Q\\ncy.get(\\\"button\\\").click().then(function($button){\\n  var p = Q.defer()\\n\\n  setTimeout(function(){\\n    p.resolve()\\n  }, 5000)\\n\\n  return p.promise\\n})\\n\\n\\n// if using bluebird\\ncy.get(\\\"button\\\").click().then(function($button){\\n  return Promise.delay(5000)\\n})\\n\\n\\n// if using jQuery deferred's\\ncy.get(\\\"button\\\").click().then(function($button){\\n  var df = $.Deferred()\\n\\n  setTimeout(function(){\\n    df.resolve()\\n  }, 5000)\\n\\n  return df\\n})\\n\",\n            \"language\": \"javascript\"\n        }\n    ]\n}\n[/block]\n\n***\n\n## Returning `null` or `undefined` will not modify the subject\n\n[block:code]\n{\n    \"codes\": [\n        {\n            \"code\": \"cy\\n  .get(\\\"form\\\").then(function($form){\\n    console.log(\\\"form is:\\\", $form)\\n    // undefined is returned here, therefore\\n    // the $form subject will automatically\\n    // carry over and allow for continued chaining\\n  }).find(\\\"input\\\").then(function($input){\\n    // we have our real $input element here since\\n    // our form element carried over and we called\\n    // .find(\\\"input\\\") on it\\n  })\\n\",\n            \"language\": \"javascript\"\n        }\n    ]\n}\n[/block]\n\n***\n\n# Options Usage\n\n[block:code]\n{\n    \"codes\": [\n        {\n            \"code\": \"cy.then({timeout: 7000}, function(){\\n  // code here\\n})\\n\",\n            \"language\": \"javascript\"\n        }\n    ]\n}\n[/block]\n\n***\n\n# Related\n\n- [its](https://on.cypress.io/api/its)\n- [invoke](https://on.cypress.io/api/invoke)\n- [Issuing Commands](https://on.cypress.io/guides/issuing-commands)","excerpt":"Invokes a callback function with the current subject","slug":"then","type":"basic","title":"then"}

then

Invokes a callback function with the current subject

`cy.then()` will yield you the current subject as the first argument. `cy.then()` is modeled identically to the way Promises work in JavaScript. Whatever is returned from the callback function becomes the new subject, and will flow into the next command, with the exception of `null` and `undefined`. When `null` or `undefined` is returned by the callback function, the subject will not be modified and will instead carry over to the next command. Just like Promises, you can return any compatible "thenable" (anything that has a `.then()` interface) and Cypress will wait for that to resolve before continuing forward through the chain of commands. | | | |--- | --- | | **Returns** | the return of the callback function | | **Timeout** | `cy.then` will retry for the duration of the [`defaultCommandTimeout`](https://on.cypress.io/guides/configuration#section-timeouts) or the duration of the `timeout` specified in the command's [options](#section-options). | *** # [cy.then( *function* )](#section-usage) Yield the current subject as the first argument. *** # Usage ## The element `input` is yielded [block:code] { "codes": [ { "code": "<form id=\"todos\">\n <input type=\"text\" class=\"addTodo\" />\n</form>\n", "language": "html" } ] } [/block] [block:code] { "codes": [ { "code": "cy.get(\"form\").find(\"input\").then(function($input){\n // work with $input subject here\n // we can potentially use it within an assertion\n // or just call some methods on it and return a new subject\n})\n", "language": "javascript" } ] } [/block] *** # Options Pass in an options object to change the default behavior of `cy.then`. **[cy.click( *options*, *function* )](#options-usage)** Option | Default | Notes --- | --- | --- `timeout` | [`defaultCommandTimeout`](https://on.cypress.io/guides/configuration#section-timeouts) | Total time to retry the click *** # Usage ## Assert explicitly about the subject `<li>`'s [block:code] { "codes": [ { "code": "<div id=\"todos\">\n <li>Walk the dog</li>\n <li>Feed the cat</li>\n <li>Write JavaScript</li>\n</div>\n", "language": "html" } ] } [/block] [block:code] { "codes": [ { "code": "cy.get(\"#todos li\").then(function($lis){\n expect($lis).to.have.length(3)\n expect($lis.eq(0)).to.contain(\"Walk the dog\")\n expect($lis.eq(1)).to.contain(\"Feed the cat\")\n expect($lis.eq(2)).to.contain(\"Write JavaScript\")\n})\n", "language": "javascript" } ] } [/block] Normally you'd use implicit subject assertions via [should](https://on.cypress.io/api/should) or [and](https://on.cypress.io/api/and), but it's sometimes it's more convenient to write explicit assertions about a given subject. [block:callout] { "type": "warning", "body": "Any errors raised by failed assertions will immediately bubble up and cause the test to fail." } [/block] *** ## The subject is changed by returning `{foo: 'bar'}` [block:code] { "codes": [ { "code": "cy.then(function(){\n return {foo: \"bar\"}\n}).then(function(obj){\n // subject is now the obj {foo: \"bar\"}\n expect(obj).to.deep.eq({foo: \"bar\"}) // true\n})\n", "language": "javascript" } ] } [/block] *** ## Cypress waits for the Promise to resolve before continuing [block:code] { "codes": [ { "code": "// if using Q\ncy.get(\"button\").click().then(function($button){\n var p = Q.defer()\n\n setTimeout(function(){\n p.resolve()\n }, 5000)\n\n return p.promise\n})\n\n\n// if using bluebird\ncy.get(\"button\").click().then(function($button){\n return Promise.delay(5000)\n})\n\n\n// if using jQuery deferred's\ncy.get(\"button\").click().then(function($button){\n var df = $.Deferred()\n\n setTimeout(function(){\n df.resolve()\n }, 5000)\n\n return df\n})\n", "language": "javascript" } ] } [/block] *** ## Returning `null` or `undefined` will not modify the subject [block:code] { "codes": [ { "code": "cy\n .get(\"form\").then(function($form){\n console.log(\"form is:\", $form)\n // undefined is returned here, therefore\n // the $form subject will automatically\n // carry over and allow for continued chaining\n }).find(\"input\").then(function($input){\n // we have our real $input element here since\n // our form element carried over and we called\n // .find(\"input\") on it\n })\n", "language": "javascript" } ] } [/block] *** # Options Usage [block:code] { "codes": [ { "code": "cy.then({timeout: 7000}, function(){\n // code here\n})\n", "language": "javascript" } ] } [/block] *** # Related - [its](https://on.cypress.io/api/its) - [invoke](https://on.cypress.io/api/invoke) - [Issuing Commands](https://on.cypress.io/guides/issuing-commands)