cypress-example-kitchensink
Advanced tools
Comparing version 0.7.0 to 0.7.1-dev.20170910.193949
@@ -80,2 +80,8 @@ // initialize highlight.js for JavaScript code highlighting | ||
// listen to input range for trigger command | ||
$('.trigger-input-range').on('change', (e) => { | ||
const $range = $(e.target) | ||
$range.next('p').text($range.val()) | ||
}) | ||
// begin: Handle our route listeners ------------- | ||
@@ -82,0 +88,0 @@ |
@@ -11,39 +11,18 @@ // | ||
// **** Test Structure **** | ||
// | ||
// Cypress has adopted Mocha's bdd syntax. | ||
// https://on.cypress.io/guides/bundled-tools#section-mocha | ||
// | ||
// Please read our "Introduction to Cypress" | ||
// https://on.cypress.io/introduction-to-cypress | ||
describe('Kitchen Sink', function(){ | ||
it('.should() - assert that <title> is correct', function(){ | ||
beforeEach(function(){ | ||
// **** Resetting State Before Each Test **** | ||
// | ||
// Visiting our app before each test | ||
// removes any state build up from | ||
// previous tests. Visiting acts as if | ||
// we closed a tab and opened a fresh one | ||
// | ||
// By default Cypress also automatically | ||
// clears the Local Storage and Cookies | ||
// before each test. | ||
}) | ||
it('cy.should - assert that <title> is correct', function(){ | ||
// https://on.cypress.io/api/visit | ||
// https://on.cypress.io/visit | ||
cy.visit('http://localhost:8080') | ||
// **** Making Assertions **** | ||
// | ||
// Here we've made our first assertion using a 'cy.should()' command. | ||
// Here we've made our first assertion using a '.should()' command. | ||
// An assertion is comprised of a chainer, subject, and optional value. | ||
// Chainers are available from Chai, Chai-jQuery, and Chai-Sinon. | ||
// https://on.cypress.io/guides/making-assertions | ||
// | ||
// https://on.cypress.io/api/should | ||
// https://on.cypress.io/api/and | ||
// https://on.cypress.io/api/title | ||
// https://on.cypress.io/should | ||
// https://on.cypress.io/and | ||
// https://on.cypress.io/title | ||
cy.title().should('include', 'Kitchen Sink') | ||
@@ -56,7 +35,7 @@ // ↲ ↲ ↲ | ||
beforeEach(function(){ | ||
// Visiting our app before each test removes any state build up from | ||
// previous tests. Visiting acts as if we closed a tab and opened a fresh one | ||
cy.visit('http://localhost:8080/commands/querying') | ||
}) | ||
// **** Querying DOM Elements **** | ||
// | ||
// Let's query for some DOM elements and make assertions | ||
@@ -67,8 +46,8 @@ // The most commonly used query is 'cy.get()', you can | ||
it('cy.get() - query DOM elements', function(){ | ||
// https://on.cypress.io/get | ||
// https://on.cypress.io/api/get | ||
// We can get DOM elements by id | ||
// Get DOM elements by id | ||
cy.get('#query-btn').should('contain', 'Button') | ||
// We can get DOM elements by class | ||
// Get DOM elements by class | ||
cy.get('.query-btn').should('contain', 'Button') | ||
@@ -78,40 +57,34 @@ | ||
// ↲ | ||
// we can CSS selectors just like jQuery | ||
// Use CSS selectors just like jQuery | ||
}) | ||
it('cy.contains() - query DOM elements with matching content', function(){ | ||
// https://on.cypress.io/contains | ||
cy.get('.query-list') | ||
.contains('bananas').should('have.class', 'third') | ||
// https://on.cypress.io/api/contains | ||
cy | ||
.get('.query-list') | ||
.contains('bananas').should('have.class', 'third') | ||
// we can pass a regexp to `.contains()` | ||
cy.get('.query-list') | ||
.contains(/^b\w+/).should('have.class', 'third') | ||
// we can even pass a regexp to `cy.contains()` | ||
.get('.query-list') | ||
.contains(/^b\w+/).should('have.class', 'third') | ||
cy.get('.query-list') | ||
.contains('apples').should('have.class', 'first') | ||
// `cy.contains()` will return the first matched element | ||
.get('.query-list') | ||
.contains('apples').should('have.class', 'first') | ||
// passing a selector to contains will yield the selector containing the text | ||
cy.get('#querying') | ||
.contains('ul', 'oranges').should('have.class', 'query-list') | ||
// passing a selector to contains will return the parent | ||
// selector containing the text | ||
.get('#querying') | ||
.contains('ul', 'oranges').should('have.class', 'query-list') | ||
// `cy.contains()` will favor input[type='submit'], | ||
// button, a, and label over deeper elements inside them | ||
// this will not return the <span> inside the button, | ||
// but the <button> itself | ||
.get('.query-button') | ||
.contains('Save Form').should('have.class', 'btn') | ||
// `.contains()` will favor input[type='submit'], | ||
// button, a, and label over deeper elements inside them | ||
// this will not yield the <span> inside the button, | ||
// but the <button> itself | ||
cy.get('.query-button') | ||
.contains('Save Form').should('have.class', 'btn') | ||
}) | ||
it('cy.within() - query DOM elements within a specific element', function(){ | ||
// https://on.cypress.io/api/within | ||
it('.within() - query DOM elements within a specific element', function(){ | ||
// https://on.cypress.io/within | ||
cy.get('.query-form').within(function(){ | ||
cy | ||
.get('input:first').should('have.attr', 'placeholder', 'Email') | ||
.get('input:last').should('have.attr', 'placeholder', 'Password') | ||
cy.get('input:first').should('have.attr', 'placeholder', 'Email') | ||
cy.get('input:last').should('have.attr', 'placeholder', 'Password') | ||
}) | ||
@@ -121,4 +94,3 @@ }) | ||
it('cy.root() - query the root DOM element', function(){ | ||
// https://on.cypress.io/api/root | ||
// https://on.cypress.io/root | ||
// By default, root is the document | ||
@@ -139,113 +111,96 @@ cy.root().should('match', 'html') | ||
// **** Traversing DOM Elements **** | ||
// | ||
// Let's query for some DOM elements and make assertions | ||
// The most commonly used query is 'cy.get()', you can | ||
// think of this like the '$' in jQuery | ||
it('cy.children() - get child DOM elements', function(){ | ||
// https://on.cypress.io/api/children | ||
cy.get('.traversal-breadcrumb').children('.active').should('contain', 'Data') | ||
it('.children() - get child DOM elements', function(){ | ||
// https://on.cypress.io/children | ||
cy.get('.traversal-breadcrumb').children('.active') | ||
.should('contain', 'Data') | ||
}) | ||
it('cy.closest() - get closest ancestor DOM element', function(){ | ||
// https://on.cypress.io/api/closest | ||
cy.get('.traversal-badge').closest('ul').should('have.class', 'list-group') | ||
it('.closest() - get closest ancestor DOM element', function(){ | ||
// https://on.cypress.io/closest | ||
cy.get('.traversal-badge').closest('ul') | ||
.should('have.class', 'list-group') | ||
}) | ||
it('cy.eq() - get a DOM element at a specific index', function(){ | ||
// https://on.cypress.io/api/eq | ||
it('.eq() - get a DOM element at a specific index', function(){ | ||
// https://on.cypress.io/eq | ||
cy.get('.traversal-list>li').eq(1).should('contain', 'siamese') | ||
}) | ||
it('cy.filter() - get DOM elements that match the selector', function(){ | ||
// https://on.cypress.io/api/filter | ||
it('.filter() - get DOM elements that match the selector', function(){ | ||
// https://on.cypress.io/filter | ||
cy.get('.traversal-nav>li').filter('.active').should('contain', 'About') | ||
}) | ||
it('cy.find() - get descendant DOM elements of the selector', function(){ | ||
// https://on.cypress.io/api/find | ||
cy.get('.traversal-pagination').find('li').find('a').should('have.length', 7) | ||
it('.find() - get descendant DOM elements of the selector', function(){ | ||
// https://on.cypress.io/find | ||
cy.get('.traversal-pagination').find('li').find('a') | ||
.should('have.length', 7) | ||
}) | ||
it('cy.first() - get first DOM element', function(){ | ||
// https://on.cypress.io/api/first | ||
it('.first() - get first DOM element', function(){ | ||
// https://on.cypress.io/first | ||
cy.get('.traversal-table td').first().should('contain', '1') | ||
}) | ||
it('cy.last() - get last DOM element', function(){ | ||
// https://on.cypress.io/api/last | ||
it('.last() - get last DOM element', function(){ | ||
// https://on.cypress.io/last | ||
cy.get('.traversal-buttons .btn').last().should('contain', 'Submit') | ||
}) | ||
it('cy.next() - get next sibling DOM element', function(){ | ||
// https://on.cypress.io/api/next | ||
it('.next() - get next sibling DOM element', function(){ | ||
// https://on.cypress.io/next | ||
cy.get('.traversal-ul').contains('apples').next().should('contain', 'oranges') | ||
}) | ||
it('cy.nextAll() - get all next sibling DOM elements', function(){ | ||
// https://on.cypress.io/api/nextall | ||
cy.get('.traversal-next-all').contains('oranges').nextAll().should("have.length", 3) | ||
it('.nextAll() - get all next sibling DOM elements', function(){ | ||
// https://on.cypress.io/nextall | ||
cy.get('.traversal-next-all').contains('oranges') | ||
.nextAll().should('have.length', 3) | ||
}) | ||
it('cy.nextUntil() - get all next sibling DOM elements until other element', function(){ | ||
// https://on.cypress.io/api/nextuntil | ||
cy.get("#veggies").nextUntil("#nuts").should("have.length", 3) | ||
it('.nextUntil() - get next sibling DOM elements until next el', function(){ | ||
// https://on.cypress.io/nextuntil | ||
cy.get('#veggies').nextUntil('#nuts').should('have.length', 3) | ||
}) | ||
it('cy.not() - remove DOM elements from set of DOM elements', function(){ | ||
// https://on.cypress.io/api/not | ||
it('.not() - remove DOM elements from set of DOM elements', function(){ | ||
// https://on.cypress.io/not | ||
cy.get('.traversal-disabled .btn').not('[disabled]').should('not.contain', 'Disabled') | ||
}) | ||
it('cy.parent() - get parent DOM element from set of DOM elements', function(){ | ||
// https://on.cypress.io/api/parent | ||
it('.parent() - get parent DOM element from DOM elements', function(){ | ||
// https://on.cypress.io/parent | ||
cy.get('.traversal-mark').parent().should('contain', 'Morbi leo risus') | ||
}) | ||
it('cy.parents() - get parent DOM elements from set of DOM elements', function(){ | ||
// https://on.cypress.io/api/parents | ||
it('.parents() - get parent DOM elements from DOM elements', function(){ | ||
// https://on.cypress.io/parents | ||
cy.get('.traversal-cite').parents().should('match', 'blockquote') | ||
}) | ||
it('cy.parentsUntil() - get parent DOM elements from set of DOM elements until other element', function(){ | ||
// https://on.cypress.io/api/parentsuntil | ||
cy.get('.clothes-nav').find(".active").parentsUntil('.clothes-nav').should("have.length", 2) | ||
it('.parentsUntil() - get parent DOM elements from DOM elements until el', function(){ | ||
// https://on.cypress.io/parentsuntil | ||
cy.get('.clothes-nav').find('.active').parentsUntil('.clothes-nav') | ||
.should('have.length', 2) | ||
}) | ||
it('cy.prev() - get previous sibling DOM element', function(){ | ||
// https://on.cypress.io/api/prev | ||
cy.get('.birds').find(".active").prev().should("contain", "Lorikeets") | ||
it('.prev() - get previous sibling DOM element', function(){ | ||
// https://on.cypress.io/prev | ||
cy.get('.birds').find('.active').prev().should('contain', 'Lorikeets') | ||
}) | ||
it('cy.prevAll() - get all previous sibling DOM elements', function(){ | ||
// https://on.cypress.io/api/prevAll | ||
cy.get('.fruits-list').find(".third").prevAll().should("have.length", 2) | ||
it('.prevAll() - get all previous sibling DOM elements', function(){ | ||
// https://on.cypress.io/prevAll | ||
cy.get('.fruits-list').find('.third').prevAll().should('have.length', 2) | ||
}) | ||
it('cy.prevUntil() - get all previous sibling DOM elements until other element', function(){ | ||
// https://on.cypress.io/api/prevUntil | ||
cy.get(".foods-list").find("#nuts").prevUntil("#veggies") | ||
it('.prevUntil() - get all previous sibling DOM elements until el', function(){ | ||
// https://on.cypress.io/prevUntil | ||
cy.get('.foods-list').find('#nuts').prevUntil('#veggies') | ||
}) | ||
it('cy.siblings() - get all sibling DOM elements from set of DOM elements', function(){ | ||
// https://on.cypress.io/api/siblings | ||
it('.siblings() - get all sibling DOM elements', function(){ | ||
// https://on.cypress.io/siblings | ||
cy.get('.traversal-pills .active').siblings().should('have.length', 2) | ||
@@ -260,20 +215,15 @@ }) | ||
// **** Actions **** | ||
// | ||
// Let's perform some actions on DOM elements | ||
// Most of these involve filling in form elements | ||
// But some actions, like click, will often be | ||
// used throughout an application | ||
// https://on.cypress.io/interacting-with-elements | ||
it('cy.type() - type into a DOM element', function(){ | ||
// https://on.cypress.io/api/type | ||
cy | ||
.get('.action-email') | ||
it('.type() - type into a DOM element', function(){ | ||
// https://on.cypress.io/type | ||
cy.get('.action-email') | ||
.type('fake@email.com').should('have.value', 'fake@email.com') | ||
// cy.type() may include special character sequences | ||
.type('{leftarrow}{rightarrow}{uparrow}{downarrow}{del}{selectall}{backspace}') | ||
// .type() with special character sequences | ||
.type('{leftarrow}{rightarrow}{uparrow}{downarrow}') | ||
.type('{del}{selectall}{backspace}') | ||
// cy.type() may additionally include key modifiers | ||
// .type() with key modifiers | ||
.type('{alt}{option}') //these are equivalent | ||
@@ -284,110 +234,85 @@ .type('{ctrl}{control}') //these are equivalent | ||
// **** Type Options **** | ||
// | ||
// cy.type() accepts options that control typing | ||
// | ||
// Delay each keypress by 0.1 sec | ||
// You may want to set the delay which | ||
// causes the keystrokes to happen much slower | ||
// in some situations if the application under | ||
// test is not able to handle rapid firing events. | ||
// (generally due to the app not properly throttling events) | ||
.type('slow.typing@email.com', {delay: 100}) | ||
.should('have.value', 'slow.typing@email.com') | ||
.should('have.value', 'slow.typing@email.com') | ||
.get('.action-disabled') | ||
cy.get('.action-disabled') | ||
// Ignore error checking prior to type | ||
// like whether the input is visible or disabled | ||
.type('disabled error checking', {force: true}) | ||
.should('have.value', 'disabled error checking') | ||
.should('have.value', 'disabled error checking') | ||
}) | ||
it('cy.focus() - focus on a DOM element', function(){ | ||
// https://on.cypress.io/api/focus | ||
cy | ||
.get('.action-focus').focus() | ||
it('.focus() - focus on a DOM element', function(){ | ||
// https://on.cypress.io/focus | ||
cy.get('.action-focus').focus() | ||
.should('have.class', 'focus') | ||
.prev().should('have.attr', 'style', 'color: orange;') | ||
.prev().should('have.attr', 'style', 'color: orange;') | ||
}) | ||
it('cy.blur() - blur off a DOM element', function(){ | ||
// https://on.cypress.io/api/blur | ||
cy | ||
.get('.action-blur').type('I\'m about to blur').blur() | ||
it('.blur() - blur off a DOM element', function(){ | ||
// https://on.cypress.io/blur | ||
cy.get('.action-blur').type('I\'m about to blur').blur() | ||
.should('have.class', 'error') | ||
.prev().should('have.attr', 'style', 'color: red;') | ||
.prev().should('have.attr', 'style', 'color: red;') | ||
}) | ||
it('cy.clear() - clears the value of an input or textarea element', function(){ | ||
// https://on.cypress.io/api/clear | ||
cy | ||
.get('.action-clear').type('We are going to clear this text') | ||
.should('have.value', 'We are going to clear this text') | ||
it('.clear() - clears an input or textarea element', function(){ | ||
// https://on.cypress.io/clear | ||
cy.get('.action-clear').type('We are going to clear this text') | ||
.should('have.value', 'We are going to clear this text') | ||
.clear() | ||
.should('have.value', '') | ||
.should('have.value', '') | ||
}) | ||
it('cy.submit() - submit a form', function(){ | ||
// https://on.cypress.io/api/submit | ||
cy | ||
.get('.action-form') | ||
.find('[type="text"]').type('HALFOFF') | ||
.get('.action-form').submit() | ||
.next().should('contain', 'Your form has been submitted!') | ||
it('.submit() - submit a form', function(){ | ||
// https://on.cypress.io/submit | ||
cy.get('.action-form') | ||
.find('[type="text"]').type('HALFOFF') | ||
cy.get('.action-form').submit() | ||
.next().should('contain', 'Your form has been submitted!') | ||
}) | ||
it('cy.click() - click on a DOM element', function(){ | ||
// https://on.cypress.io/api/click | ||
it('.click() - click on a DOM element', function(){ | ||
// https://on.cypress.io/click | ||
cy.get('.action-btn').click() | ||
// **** Click Position **** | ||
// | ||
// cy.click() accepts a position argument | ||
// that controls where the click occurs | ||
// | ||
// You can clock on 9 specific positions of an element: | ||
// ----------------------------------- | ||
// | topLeft top topRight | | ||
// | | | ||
// | | | ||
// | | | ||
// | left center right | | ||
// | | | ||
// | | | ||
// | | | ||
// | bottomLeft bottom bottomRight | | ||
// ----------------------------------- | ||
// clicking in the center of the element is the default | ||
cy.get('#action-canvas').click() | ||
// click the top left corner of the element | ||
cy.get('#action-canvas').click('topLeft') | ||
// click the top right corner of the element | ||
cy.get('#action-canvas').click('top') | ||
cy.get('#action-canvas').click('topRight') | ||
// click the bottom left corner of the element | ||
cy.get('#action-canvas').click('left') | ||
cy.get('#action-canvas').click('right') | ||
cy.get('#action-canvas').click('bottomLeft') | ||
// click the bottom right corner of the element | ||
cy.get('#action-canvas').click('bottom') | ||
cy.get('#action-canvas').click('bottomRight') | ||
// **** Click Coordinate **** | ||
// | ||
// cy.click() accepts a an x and y coordinate | ||
// .click() accepts an x and y coordinate | ||
// that controls where the click occurs :) | ||
cy | ||
.get('#action-canvas') | ||
// click 80px on x coord and 75px on y coord | ||
.click(80, 75) | ||
.click(170, 75) | ||
.click(80, 165) | ||
.click(100, 185) | ||
.click(125, 190) | ||
.click(150, 185) | ||
.click(170, 165) | ||
cy.get('#action-canvas') | ||
.click(80, 75) // click 80px on x coord and 75px on y coord | ||
.click(170, 75) | ||
.click(80, 165) | ||
.click(100, 185) | ||
.click(125, 190) | ||
.click(150, 185) | ||
.click(170, 165) | ||
// **** Click Options **** | ||
// | ||
// cy.click() accepts options that control clicking | ||
// | ||
// click multiple elements by passing multiple: true | ||
// otherwise an error will be thrown if multiple | ||
// elements are the subject of cy.click | ||
cy.get('.action-labels>.label').click({multiple: true}) | ||
@@ -401,112 +326,177 @@ | ||
it('cy.dblclick() - double click on a DOM element', function(){ | ||
// We have a listener on 'dblclick' event in our 'scripts.js' | ||
it('.dblclick() - double click on a DOM element', function(){ | ||
// Our app has a listener on 'dblclick' event in our 'scripts.js' | ||
// that hides the div and shows an input on double click | ||
// https://on.cypress.io/api/dblclick | ||
cy | ||
.get('.action-div').dblclick().should('not.be.visible') | ||
.get('.action-input-hidden').should('be.visible') | ||
// https://on.cypress.io/dblclick | ||
cy.get('.action-div').dblclick().should('not.be.visible') | ||
cy.get('.action-input-hidden').should('be.visible') | ||
}) | ||
it('cy.check() - check a checkbox or radio element', function(){ | ||
// By default, cy.check() will check all | ||
// By default, .check() will check all | ||
// matching checkbox or radio elements in succession, one after another | ||
// https://on.cypress.io/api/check | ||
cy | ||
.get('.action-checkboxes [type="checkbox"]').not('[disabled]').check().should('be.checked') | ||
// https://on.cypress.io/check | ||
cy.get('.action-checkboxes [type="checkbox"]').not('[disabled]') | ||
.check().should('be.checked') | ||
.get('.action-radios [type="radio"]').not('[disabled]').check().should('be.checked') | ||
cy.get('.action-radios [type="radio"]').not('[disabled]') | ||
.check().should('be.checked') | ||
// **** Check Value **** | ||
// | ||
// cy.check() accepts a value argument | ||
// .check() accepts a value argument | ||
// that checks only checkboxes or radios | ||
// with matching values | ||
// | ||
.get('.action-radios [type="radio"]').check('radio1').should('be.checked') | ||
cy.get('.action-radios [type="radio"]').check('radio1').should('be.checked') | ||
// **** Check Values **** | ||
// | ||
// cy.check() accepts an array of values | ||
// .check() accepts an array of values | ||
// that checks only checkboxes or radios | ||
// with matching values | ||
// | ||
.get('.action-multiple-checkboxes [type="checkbox"]').check(['checkbox1', 'checkbox2']).should('be.checked') | ||
cy.get('.action-multiple-checkboxes [type="checkbox"]') | ||
.check(['checkbox1', 'checkbox2']).should('be.checked') | ||
// **** Check Options **** | ||
// | ||
// cy.check() accepts options that control checking | ||
// | ||
// Ignore error checking prior to checking | ||
// like whether the element is visible, clickable or disabled | ||
// this checkbox below is disabled. | ||
.get('.action-checkboxes [disabled]') | ||
.check({force: true}).should('be.checked') | ||
cy.get('.action-checkboxes [disabled]') | ||
.check({force: true}).should('be.checked') | ||
.get('.action-radios [type="radio"]').check('radio3', {force: true}).should('be.checked') | ||
cy.get('.action-radios [type="radio"]') | ||
.check('radio3', {force: true}).should('be.checked') | ||
}) | ||
it('cy.uncheck() - uncheck a checkbox element', function(){ | ||
// By default, cy.uncheck() will uncheck all matching | ||
it('.uncheck() - uncheck a checkbox element', function(){ | ||
// By default, .uncheck() will uncheck all matching | ||
// checkbox elements in succession, one after another | ||
// https://on.cypress.io/api/uncheck | ||
cy | ||
.get('.action-check [type="checkbox"]') | ||
.not('[disabled]') | ||
.uncheck().should('not.be.checked') | ||
// https://on.cypress.io/uncheck | ||
cy.get('.action-check [type="checkbox"]') | ||
.not('[disabled]') | ||
.uncheck().should('not.be.checked') | ||
// **** Check Value **** | ||
// | ||
// cy.uncheck() accepts a value argument | ||
// .uncheck() accepts a value argument | ||
// that unchecks only checkboxes | ||
// with matching values | ||
// | ||
.get('.action-check [type="checkbox"]') | ||
.check('checkbox1') | ||
.uncheck('checkbox1').should('not.be.checked') | ||
cy.get('.action-check [type="checkbox"]') | ||
.check('checkbox1') | ||
.uncheck('checkbox1').should('not.be.checked') | ||
// **** Uncheck Values **** | ||
// | ||
// cy.uncheck() accepts an array of values | ||
// .uncheck() accepts an array of values | ||
// that unchecks only checkboxes or radios | ||
// with matching values | ||
// | ||
.get('.action-check [type="checkbox"]') | ||
.check(['checkbox1', 'checkbox3']) | ||
.uncheck(['checkbox1', 'checkbox3']).should('not.be.checked') | ||
cy.get('.action-check [type="checkbox"]') | ||
.check(['checkbox1', 'checkbox3']) | ||
.uncheck(['checkbox1', 'checkbox3']).should('not.be.checked') | ||
// **** Uncheck Options **** | ||
// | ||
// cy.uncheck() accepts options that control unchecking | ||
// | ||
// Ignore error checking prior to unchecking | ||
// like whether the element is visible, clickable or disabled | ||
// this checkbox below is disabled. | ||
.get('.action-check [disabled]') | ||
.uncheck({force: true}).should('not.be.checked') | ||
cy.get('.action-check [disabled]') | ||
.uncheck({force: true}).should('not.be.checked') | ||
}) | ||
it('cy.select() - select an option in a <select> element', function(){ | ||
it('.select() - select an option in a <select> element', function(){ | ||
// https://on.cypress.io/select | ||
// https://on.cypress.io/api/select | ||
// Select the option with matching text content | ||
// Select option with matching text content | ||
cy.get('.action-select').select('apples') | ||
// Select the option with matching value | ||
// Select option with matching value | ||
cy.get('.action-select').select('fr-bananas') | ||
// Select the options with matching text content | ||
cy.get('.action-select-multiple').select(['apples', 'oranges', 'bananas']) | ||
// Select options with matching text content | ||
cy.get('.action-select-multiple') | ||
.select(['apples', 'oranges', 'bananas']) | ||
// Select the options with matching values | ||
cy.get('.action-select-multiple').select(['fr-apples', 'fr-oranges', 'fr-bananas']) | ||
// Select options with matching values | ||
cy.get('.action-select-multiple') | ||
.select(['fr-apples', 'fr-oranges', 'fr-bananas']) | ||
}) | ||
it('.scrollIntoView() - scroll an element into view', function(){ | ||
// https://on.cypress.io/scrollintoview | ||
// normally all of these buttons are hidden, because they're not within | ||
// the viewable area of their parent (we need to scroll to see them) | ||
cy.get('#scroll-horizontal button') | ||
.should('not.be.visible') | ||
// scroll the button into view, as if the user had scrolled | ||
cy.get('#scroll-horizontal button').scrollIntoView() | ||
.should('be.visible') | ||
cy.get('#scroll-vertical button') | ||
.should('not.be.visible') | ||
// Cypress handles the scroll direction needed | ||
cy.get('#scroll-vertical button').scrollIntoView() | ||
.should('be.visible') | ||
cy.get('#scroll-both button') | ||
.should('not.be.visible') | ||
// Cypress knows to scroll to the right and down | ||
cy.get('#scroll-both button').scrollIntoView() | ||
.should('be.visible') | ||
}) | ||
it('cy.scrollTo() - scroll the window or element to a position', function(){ | ||
// https://on.cypress.io/scrollTo | ||
// You can scroll to 9 specific positions of an element: | ||
// ----------------------------------- | ||
// | topLeft top topRight | | ||
// | | | ||
// | | | ||
// | | | ||
// | left center right | | ||
// | | | ||
// | | | ||
// | | | ||
// | bottomLeft bottom bottomRight | | ||
// ----------------------------------- | ||
// if you chain .scrollTo() off of cy, we will | ||
// scroll the entire window | ||
cy.scrollTo('bottom') | ||
cy.get('#scrollable-horizontal').scrollTo('right') | ||
// or you can scroll to a specific coordinate: | ||
// (x axis, y axis) in pixels | ||
cy.get('#scrollable-vertical').scrollTo(250, 250) | ||
// or you can scroll to a specific percentage | ||
// of the (width, height) of the element | ||
cy.get('#scrollable-both').scrollTo('75%', '25%') | ||
// control the easing of the scroll (default is 'swing') | ||
cy.get('#scrollable-vertical').scrollTo('center', {easing: 'linear'} ) | ||
// control the duration of the scroll (in ms) | ||
cy.get('#scrollable-both').scrollTo('center', {duration: 2000} ) | ||
}) | ||
it('.trigger() - trigger an event on a DOM element', function(){ | ||
// To interact with a range input (slider), we need to set its value and | ||
// then trigger the appropriate event to signal it has changed | ||
// Here, we invoke jQuery's val() method to set the value | ||
// and trigger the 'change' event | ||
// Note that some implementations may rely on the 'input' event, | ||
// which is fired as a user moves the slider, but is not supported | ||
// by some browsers | ||
// https://on.cypress.io/trigger | ||
cy.get('.trigger-input-range') | ||
.invoke('val', 25) | ||
.trigger('change') | ||
.get('input[type=range]').siblings('p') | ||
.should('have.text', '25') | ||
// See our example recipes for more examples of using trigger | ||
// https://on.cypress.io/examples | ||
}) | ||
}) | ||
@@ -519,10 +509,4 @@ | ||
// **** Window **** | ||
// | ||
// Cypress has commands to help you get | ||
// access to window, document, and title | ||
it('cy.window() - get the global window object', function(){ | ||
// https://on.cypress.io/api/window | ||
// https://on.cypress.io/window | ||
cy.window().should('have.property', 'top') | ||
@@ -532,4 +516,3 @@ }) | ||
it('cy.document() - get the document object', function(){ | ||
// https://on.cypress.io/api/document | ||
// https://on.cypress.io/document | ||
cy.document().should('have.property', 'charset').and('eq', 'UTF-8') | ||
@@ -539,4 +522,3 @@ }) | ||
it('cy.title() - get the title', function(){ | ||
// https://on.cypress.io/api/title | ||
// https://on.cypress.io/title | ||
cy.title().should('include', 'Kitchen Sink') | ||
@@ -551,21 +533,13 @@ }) | ||
// **** Viewport **** | ||
// | ||
// Let's make some assertions based on | ||
// the size of our screen. This command | ||
// is great for checking responsive logic | ||
it('cy.viewport() - set the viewport size and dimension', function(){ | ||
cy | ||
.get('#navbar').should('be.visible') | ||
cy.get('#navbar').should('be.visible') | ||
// https://on.cypress.io/api/viewport | ||
// https://on.cypress.io/viewport | ||
cy.viewport(320, 480) | ||
// the navbar should have collapse since our screen is smaller | ||
cy | ||
.get('#navbar').should('not.be.visible') | ||
.get('.navbar-toggle').should('be.visible').click() | ||
.get('.nav').find('a').should('be.visible') | ||
cy.get('#navbar').should('not.be.visible') | ||
cy.get('.navbar-toggle').should('be.visible').click() | ||
cy.get('.nav').find('a').should('be.visible') | ||
@@ -575,4 +549,2 @@ // lets see what our app looks like on a super large screen | ||
// **** Viewport Presets **** | ||
// | ||
// cy.viewport() accepts a set of preset sizes | ||
@@ -583,35 +555,30 @@ // to easily set the screen to a device's width and height | ||
// the change otherwise it's a little too fast to see :) | ||
// | ||
cy | ||
.viewport('macbook-15') | ||
.wait(200) | ||
.viewport('macbook-13') | ||
.wait(200) | ||
.viewport('macbook-11') | ||
.wait(200) | ||
.viewport('ipad-2') | ||
.wait(200) | ||
.viewport('ipad-mini') | ||
.wait(200) | ||
.viewport('iphone-6+') | ||
.wait(200) | ||
.viewport('iphone-6') | ||
.wait(200) | ||
.viewport('iphone-5') | ||
.wait(200) | ||
.viewport('iphone-4') | ||
.wait(200) | ||
.viewport('iphone-3') | ||
.wait(200) | ||
// **** Viewport Orientation **** | ||
// | ||
cy.viewport('macbook-15') | ||
cy.wait(200) | ||
cy.viewport('macbook-13') | ||
cy.wait(200) | ||
cy.viewport('macbook-11') | ||
cy.wait(200) | ||
cy.viewport('ipad-2') | ||
cy.wait(200) | ||
cy.viewport('ipad-mini') | ||
cy.wait(200) | ||
cy.viewport('iphone-6+') | ||
cy.wait(200) | ||
cy.viewport('iphone-6') | ||
cy.wait(200) | ||
cy.viewport('iphone-5') | ||
cy.wait(200) | ||
cy.viewport('iphone-4') | ||
cy.wait(200) | ||
cy.viewport('iphone-3') | ||
cy.wait(200) | ||
// cy.viewport() accepts an orientation for all presets | ||
// the default orientation is 'portrait' | ||
// | ||
cy | ||
.viewport('ipad-2', 'portrait') | ||
.wait(200) | ||
.viewport('iphone-4', 'landscape') | ||
.wait(200) | ||
cy.viewport('ipad-2', 'portrait') | ||
cy.wait(200) | ||
cy.viewport('iphone-4', 'landscape') | ||
cy.wait(200) | ||
@@ -628,4 +595,2 @@ // The viewport will be reset back to the default dimensions | ||
// **** Location **** | ||
// | ||
// We look at the url to make assertions | ||
@@ -635,4 +600,3 @@ // about the page's state | ||
it('cy.hash() - get the current URL hash', function(){ | ||
// https://on.cypress.io/api/hash | ||
// https://on.cypress.io/hash | ||
cy.hash().should('be.empty') | ||
@@ -642,5 +606,4 @@ }) | ||
it('cy.location() - get window.location', function(){ | ||
// https://on.cypress.io/api/location | ||
cy.location().then(function(location){ | ||
// https://on.cypress.io/location | ||
cy.location().should(function(location){ | ||
expect(location.hash).to.be.empty | ||
@@ -659,4 +622,3 @@ expect(location.href).to.eq('http://localhost:8080/commands/location') | ||
it('cy.url() - get the current URL', function(){ | ||
// https://on.cypress.io/api/url | ||
// https://on.cypress.io/url | ||
cy.url().should('eq', 'http://localhost:8080/commands/location') | ||
@@ -668,18 +630,11 @@ }) | ||
beforeEach(function(){ | ||
cy | ||
.visit('http://localhost:8080') | ||
.get('.navbar-nav').contains('Commands').click() | ||
.get('.dropdown-menu').contains('Navigation').click() | ||
cy.visit('http://localhost:8080') | ||
cy.get('.navbar-nav').contains('Commands').click() | ||
cy.get('.dropdown-menu').contains('Navigation').click() | ||
}) | ||
// **** Navigation **** | ||
// | ||
// We can issue commands to visit, reload the page, | ||
// navigate in the browser's history | ||
it('cy.go() - go back or forward in the browser\'s history', function(){ | ||
cy.location('pathname').should('include', 'navigation') | ||
// https://on.cypress.io/api/go | ||
// https://on.cypress.io/go | ||
cy.go('back') | ||
@@ -698,7 +653,6 @@ cy.location('pathname').should('not.include', 'navigation') | ||
cy.location('pathname').should('include', 'navigation') | ||
}) | ||
it('cy.reload() - reload the page', function(){ | ||
// https://on.cypress.io/api/reload | ||
// https://on.cypress.io/reload | ||
cy.reload() | ||
@@ -711,5 +665,5 @@ | ||
it('cy.visit() - visit a remote url', function(){ | ||
/* eslint-disable no-unused-vars */ | ||
// Visit any sub-domain of your current domain | ||
// https://on.cypress.io/api/visit | ||
// https://on.cypress.io/visit | ||
@@ -726,2 +680,3 @@ // Pass options to the visit | ||
}) | ||
/* eslint-enable no-unused-vars */ | ||
}) | ||
@@ -734,30 +689,22 @@ }) | ||
}) | ||
// **** Assertions **** | ||
// | ||
describe('Implicit Assertions', function(){ | ||
it('cy.should - make an assertion about the current subject', function(){ | ||
// https://on.cypress.io/api/should | ||
cy | ||
.get('.assertion-table') | ||
.find('tbody tr:last').should('have.class', 'success') | ||
it('.should() - make an assertion about the current subject', function(){ | ||
// https://on.cypress.io/should | ||
cy.get('.assertion-table') | ||
.find('tbody tr:last').should('have.class', 'success') | ||
}) | ||
it('cy.and - chain multiple assertions together', function(){ | ||
// https://on.cypress.io/api/and | ||
cy | ||
.get('.assertions-link') | ||
.should('have.class', 'active') | ||
.and('have.attr', 'href') | ||
.and('include', 'cypress.io') | ||
it('.and() - chain multiple assertions together', function(){ | ||
// https://on.cypress.io/and | ||
cy.get('.assertions-link') | ||
.should('have.class', 'active') | ||
.and('have.attr', 'href') | ||
.and('include', 'cypress.io') | ||
}) | ||
}) | ||
describe('Explicit Assertions', function(){ | ||
it('expect - make an assertion about a specified subject', function(){ | ||
// We can use Chai's BDD style assertions | ||
@@ -768,8 +715,7 @@ expect(true).to.be.true | ||
// of explicit assertions within it. | ||
cy | ||
.get('.assertions-p').find('p') | ||
cy.get('.assertions-p').find('p') | ||
.should(function($p){ | ||
// return an array of texts from all of the p's | ||
var texts = $p.map(function(i, el){ | ||
// https://on.cypress.io/api/cypress-jquery | ||
// https://on.cypress.io/$ | ||
return Cypress.$(el).text() | ||
@@ -780,3 +726,3 @@ }) | ||
// and .get() convert this to simple array | ||
var texts = texts.get() | ||
texts = texts.get() | ||
@@ -792,3 +738,3 @@ // array should have length of 3 | ||
]) | ||
}) | ||
}) | ||
}) | ||
@@ -803,63 +749,52 @@ }) | ||
it('cy.end() - end the command chain', function(){ | ||
it('.end() - end the command chain', function(){ | ||
// cy.end is useful when you want to end a chain of commands | ||
// and force Cypress to re-query from the root element | ||
// | ||
// https://on.cypress.io/api/end | ||
cy | ||
.get('.misc-table').within(function(){ | ||
cy | ||
// ends the current chain and returns null | ||
.contains("Cheryl").click().end() | ||
// queries the entire table again | ||
.contains("Charles").click() | ||
}) | ||
// https://on.cypress.io/end | ||
cy.get('.misc-table').within(function(){ | ||
// ends the current chain and yields null | ||
cy.contains('Cheryl').click().end() | ||
// queries the entire table again | ||
cy.contains('Charles').click() | ||
}) | ||
}) | ||
it('cy.exec() - execute a system command', function(){ | ||
// cy.exec allows you to execute a system command. | ||
// so you can take actions necessary for your test, | ||
// but outside the scope of Cypress. | ||
// | ||
// https://on.cypress.io/api/exec | ||
cy | ||
.exec('echo Jane Lane') | ||
.its('stdout').should('contain', 'Jane Lane') | ||
.exec('cat cypress.json') | ||
.its('stderr').should('be.empty') | ||
// https://on.cypress.io/exec | ||
cy.exec('echo Jane Lane') | ||
.its('stdout').should('contain', 'Jane Lane') | ||
.exec('pwd') | ||
.its('code').should('eq', 0) | ||
cy.exec('cat cypress.json') | ||
.its('stderr').should('be.empty') | ||
cy.exec('pwd') | ||
.its('code').should('eq', 0) | ||
}) | ||
it('cy.focused() - get the DOM element that has focus', function(){ | ||
// https://on.cypress.io/focused | ||
cy.get('.misc-form').find('#name').click() | ||
cy.focused().should('have.id', 'name') | ||
// https://on.cypress.io/api/focused | ||
cy | ||
.get('.misc-form').find('#name').click() | ||
.focused().should('have.id', 'name') | ||
.get('.misc-form').find('#description').click() | ||
.focused().should('have.id', 'description') | ||
cy.get('.misc-form').find('#description').click() | ||
cy.focused().should('have.id', 'description') | ||
}) | ||
it("cy.screenshot() - take a screenshot", function(){ | ||
// https://on.cypress.io/api/screenshot | ||
cy.screenshot("my-image") | ||
it('cy.screenshot() - take a screenshot', function(){ | ||
// https://on.cypress.io/screenshot | ||
cy.screenshot('my-image') | ||
}) | ||
it('cy.wrap() - wrap an object', function(){ | ||
// https://on.cypress.io/api/wrap | ||
cy | ||
.wrap({foo: 'bar'}) | ||
.should('have.property', 'foo') | ||
.and('include', 'bar') | ||
// https://on.cypress.io/wrap | ||
cy.wrap({foo: 'bar'}) | ||
.should('have.property', 'foo') | ||
.and('include', 'bar') | ||
}) | ||
}) | ||
@@ -872,14 +807,7 @@ | ||
// **** Connectors **** | ||
// | ||
// Some commands are just used to manipulate elements, | ||
// properties or invoke functions on the current subject | ||
it('cy.each() - iterate over an array of elements', function(){ | ||
// https://on.cypress.io/api/each | ||
cy | ||
.get('.connectors-each-ul>li') | ||
it('.each() - iterate over an array of elements', function(){ | ||
// https://on.cypress.io/each | ||
cy.get('.connectors-each-ul>li') | ||
.each(function($el, index, $list){ | ||
// eslint-disable-next-line no-console | ||
console.log($el, index, $list) | ||
@@ -889,29 +817,24 @@ }) | ||
it('cy.its() - get properties on the current subject', function(){ | ||
// https://on.cypress.io/api/its | ||
cy | ||
.get('.connectors-its-ul>li') | ||
// calls the 'length' property returning that value | ||
.its('length') | ||
.should('be.gt', 2) | ||
it('.its() - get properties on the current subject', function(){ | ||
// https://on.cypress.io/its | ||
cy.get('.connectors-its-ul>li') | ||
// calls the 'length' property yielding that value | ||
.its('length') | ||
.should('be.gt', 2) | ||
}) | ||
it('cy.invoke() - invoke a function on the current subject', function(){ | ||
it('.invoke() - invoke a function on the current subject', function(){ | ||
// our div is hidden in our script.js | ||
// $('.connectors-div').hide() | ||
// https://on.cypress.io/api/invoke | ||
cy | ||
.get('.connectors-div').should('be.hidden') | ||
// https://on.cypress.io/invoke | ||
cy.get('.connectors-div').should('be.hidden') | ||
// call the jquery method 'show' on the 'div.container' | ||
.invoke('show') | ||
.should('be.visible') | ||
.should('be.visible') | ||
}) | ||
it('cy.spread() - spread an array as individual arguments to a callback function', function(){ | ||
// https://on.cypress.io/api/spread | ||
it('.spread() - spread an array as individual args to callback function', function(){ | ||
// https://on.cypress.io/spread | ||
var arr = ['foo', 'bar', 'baz'] | ||
@@ -926,5 +849,4 @@ | ||
it('cy.then() - invoke a callback function with the current subject', function(){ | ||
// https://on.cypress.io/api/then | ||
it('.then() - invoke a callback function with the current subject', function(){ | ||
// https://on.cypress.io/then | ||
cy.get('.connectors-list>li').then(function($lis){ | ||
@@ -944,4 +866,2 @@ expect($lis).to.have.length(3) | ||
// **** Aliasing **** | ||
// | ||
// We alias a DOM element for use later | ||
@@ -951,21 +871,19 @@ // We don't have to traverse to the element | ||
it('cy.as() - alias a route or DOM element for later use', function(){ | ||
it('.as() - alias a route or DOM element for later use', function(){ | ||
// this is a good use case for an alias, | ||
// we don't want to write this long traversal again | ||
// | ||
// https://on.cypress.io/api/as | ||
cy | ||
.get('.as-table').find('tbody>tr') | ||
.first().find('td').first().find('button').as('firstBtn') | ||
// maybe do some more testing here... | ||
// https://on.cypress.io/as | ||
cy.get('.as-table').find('tbody>tr') | ||
.first().find('td').first().find('button').as('firstBtn') | ||
// when we reference the alias, we place an | ||
// @ in front of it's name | ||
.get('@firstBtn').click() | ||
// maybe do some more testing here... | ||
.get('@firstBtn') | ||
.should('have.class', 'btn-success') | ||
.and('contain', 'Changed') | ||
// when we reference the alias, we place an | ||
// @ in front of it's name | ||
cy.get('@firstBtn').click() | ||
cy.get('@firstBtn') | ||
.should('have.class', 'btn-success') | ||
.and('contain', 'Changed') | ||
}) | ||
@@ -978,25 +896,16 @@ }) | ||
}) | ||
// **** Waiting **** | ||
// | ||
// Wait for a specific amount of ms before | ||
// continuing to the next command | ||
// | ||
// BE CAREFUL of adding unnecessary wait times: | ||
// https://on.cypress.io/guides/anti-patterns#section-adding-unnecessary-waits | ||
// | ||
// https://on.cypress.io/api/wait | ||
// BE CAREFUL of adding unnecessary wait times. | ||
// https://on.cypress.io/wait | ||
it('cy.wait() - wait for a specific amount of time', function(){ | ||
cy.get('.wait-input1').type('Wait 1000ms after typing') | ||
cy.wait(1000) | ||
cy.get('.wait-input2').type('Wait 1000ms after typing') | ||
cy.wait(1000) | ||
cy.get('.wait-input3').type('Wait 1000ms after typing') | ||
cy.wait(1000) | ||
}) | ||
cy | ||
.get(".wait-input1").type('Wait 1000ms after typing') | ||
.wait(1000) | ||
.get(".wait-input2").type('Wait 1000ms after typing') | ||
.wait(1000) | ||
.get(".wait-input3").type('Wait 1000ms after typing') | ||
.wait(1000) | ||
}) | ||
// | ||
// Waiting for a specific resource to resolve | ||
// is covered within the cy.route() test below | ||
// | ||
}) | ||
@@ -1009,10 +918,7 @@ | ||
// **** Network Requests **** | ||
// | ||
// Manage AJAX / XHR requests in your app | ||
it('cy.server() - control the behavior of network requests and responses', function(){ | ||
// https://on.cypress.io/api/server | ||
cy.server().then(function(server){ | ||
it('cy.server() - control behavior of network requests and responses', function(){ | ||
// https://on.cypress.io/server | ||
cy.server().should(function(server){ | ||
// the default options on server | ||
@@ -1031,25 +937,27 @@ // you can override any of these options | ||
// affecting all requests | ||
expect(server.enable).to.be.true // pass false to disable existing route stubs | ||
expect(server.force404).to.be.false // forces requests that don't match your routes to 404 | ||
expect(server.whitelist).to.be.a('function') // whitelists requests from ever being logged or stubbed | ||
// pass false to disable existing route stubs | ||
expect(server.enable).to.be.true | ||
// forces requests that don't match your routes to 404 | ||
expect(server.force404).to.be.false | ||
// whitelists requests from ever being logged or stubbed | ||
expect(server.whitelist).to.be.a('function') | ||
}) | ||
cy | ||
.server({ | ||
method: 'POST', | ||
delay: 1000, | ||
status: 422, | ||
response: {} | ||
}) | ||
cy.server({ | ||
method: 'POST', | ||
delay: 1000, | ||
status: 422, | ||
response: {} | ||
}) | ||
// any route commands will now inherit the above options | ||
// from the server. anything we pass specifically | ||
// to route will override the defaults though. | ||
// any route commands will now inherit the above options | ||
// from the server. anything we pass specifically | ||
// to route will override the defaults though. | ||
}) | ||
it('cy.request() - make an XHR request', function(){ | ||
// https://on.cypress.io/api/request | ||
cy | ||
.request('https://jsonplaceholder.typicode.com/comments').then(function(response){ | ||
// https://on.cypress.io/request | ||
cy.request('https://jsonplaceholder.typicode.com/comments') | ||
.should(function(response){ | ||
expect(response.status).to.eq(200) | ||
@@ -1064,60 +972,55 @@ expect(response.body).to.have.length(500) | ||
var message = 'whoa, this comment doesn\'t exist' | ||
cy.server() | ||
// **** GET comments route **** | ||
// | ||
// https://on.cypress.io/api/route | ||
cy | ||
.route(/comments\/1/).as('getComment') | ||
// we have code that fetches a comment when | ||
// the button is clicked in scripts.js | ||
.get('.network-btn').click() | ||
// https://on.cypress.io/route | ||
cy.route(/comments\/1/).as('getComment') | ||
// **** Wait **** | ||
// | ||
// Wait for a specific resource to resolve | ||
// continuing to the next command | ||
// | ||
// https://on.cypress.io/api/wait | ||
.wait('@getComment').its('status').should('eq', 200) | ||
// we have code that fetches a comment when | ||
// the button is clicked in scripts.js | ||
cy.get('.network-btn').click() | ||
// **** Wait **** | ||
// Wait for a specific resource to resolve | ||
// continuing to the next command | ||
// https://on.cypress.io/wait | ||
cy.wait('@getComment').its('status').should('eq', 200) | ||
// **** POST comment route **** | ||
// | ||
// Specify the route to listen to method 'POST' | ||
cy | ||
.route('POST', '/comments').as('postComment') | ||
cy.route('POST', '/comments').as('postComment') | ||
// we have code that posts a comment when | ||
// the button is clicked in scripts.js | ||
.get('.network-post').click() | ||
.wait('@postComment') | ||
// we have code that posts a comment when | ||
// the button is clicked in scripts.js | ||
cy.get('.network-post').click() | ||
cy.wait('@postComment') | ||
// get the route | ||
.get('@postComment').then(function(xhr){ | ||
expect(xhr.requestBody).to.include('email') | ||
expect(xhr.requestHeaders).to.have.property('Content-Type') | ||
expect(xhr.responseBody).to.have.property('name', 'Using POST in cy.route()') | ||
}) | ||
// get the route | ||
cy.get('@postComment').then(function(xhr){ | ||
expect(xhr.requestBody).to.include('email') | ||
expect(xhr.requestHeaders).to.have.property('Content-Type') | ||
expect(xhr.responseBody).to.have.property('name', 'Using POST in cy.route()') | ||
}) | ||
// **** Stubbed PUT comment route **** | ||
// | ||
cy | ||
.route({ | ||
method: 'PUT', | ||
url: /comments\/\d+/, | ||
status: 404, | ||
response: {error: message}, | ||
delay: 500 | ||
}).as('putComment') | ||
cy.route({ | ||
method: 'PUT', | ||
url: /comments\/\d+/, | ||
status: 404, | ||
response: {error: message}, | ||
delay: 500 | ||
}).as('putComment') | ||
// we have code that puts a comment when | ||
// the button is clicked in scripts.js | ||
.get('.network-put').click() | ||
// we have code that puts a comment when | ||
// the button is clicked in scripts.js | ||
cy.get('.network-put').click() | ||
.wait('@putComment') | ||
cy.wait('@putComment') | ||
// our 404 statusCode logic in scripts.js executed | ||
.get('.network-put-comment').should('contain', message) | ||
// our 404 statusCode logic in scripts.js executed | ||
cy.get('.network-put-comment').should('contain', message) | ||
}) | ||
@@ -1130,9 +1033,3 @@ }) | ||
}) | ||
// **** Files **** | ||
// | ||
// Use files to represent data | ||
// or read / write files in your project | ||
it('cy.fixture() - load a fixture', function(){ | ||
// Instead of writing a response inline you can | ||
@@ -1144,52 +1041,47 @@ // connect a response with a fixture file | ||
// https://on.cypress.io/api/fixture | ||
cy | ||
.fixture('example.json').as('comment') | ||
// https://on.cypress.io/fixture | ||
cy.fixture('example.json').as('comment') | ||
.route(/comments/, '@comment').as('getComment') | ||
cy.route(/comments/, '@comment').as('getComment') | ||
// we have code that gets a comment when | ||
// the button is clicked in scripts.js | ||
.get('.fixture-btn').click() | ||
// we have code that gets a comment when | ||
// the button is clicked in scripts.js | ||
cy.get('.fixture-btn').click() | ||
.wait('@getComment').its('responseBody') | ||
.should('have.property', 'name') | ||
.and('include', 'Using fixtures to represent data') | ||
cy.wait('@getComment').its('responseBody') | ||
.should('have.property', 'name') | ||
.and('include', 'Using fixtures to represent data') | ||
// you can also just write the fixture in the route | ||
cy | ||
.route(/comments/, 'fixture:example.json').as('getComment') | ||
cy.route(/comments/, 'fixture:example.json').as('getComment') | ||
// we have code that gets a comment when | ||
// the button is clicked in scripts.js | ||
.get('.fixture-btn').click() | ||
// we have code that gets a comment when | ||
// the button is clicked in scripts.js | ||
cy.get('.fixture-btn').click() | ||
.wait('@getComment').its('responseBody') | ||
.should('have.property', 'name') | ||
.and('include', 'Using fixtures to represent data') | ||
cy.wait('@getComment').its('responseBody') | ||
.should('have.property', 'name') | ||
.and('include', 'Using fixtures to represent data') | ||
// or write fx to represent fixture | ||
// by default it assumes it's .json | ||
cy | ||
.route(/comments/, 'fx:example').as('getComment') | ||
cy.route(/comments/, 'fx:example').as('getComment') | ||
// we have code that gets a comment when | ||
// the button is clicked in scripts.js | ||
.get('.fixture-btn').click() | ||
// we have code that gets a comment when | ||
// the button is clicked in scripts.js | ||
cy.get('.fixture-btn').click() | ||
.wait('@getComment').its('responseBody') | ||
.should('have.property', 'name') | ||
.and('include', 'Using fixtures to represent data') | ||
cy.wait('@getComment').its('responseBody') | ||
.should('have.property', 'name') | ||
.and('include', 'Using fixtures to represent data') | ||
}) | ||
it('cy.readFile() - read a files contents', function(){ | ||
// You can read a file and returns its contents | ||
// You can read a file and yield its contents | ||
// The filePath is relative to your project's root. | ||
cy | ||
// https://on.cypress.io/api/readfile | ||
.readFile('cypress.json').then(function(json) { | ||
expect(json).to.be.an('object') | ||
}) | ||
// https://on.cypress.io/readfile | ||
cy.readFile('cypress.json').then(function(json) { | ||
expect(json).to.be.an('object') | ||
}) | ||
@@ -1199,28 +1091,26 @@ }) | ||
it('cy.writeFile() - write to a file', function(){ | ||
// You can write to a file with the specified contents | ||
// If the path to the file does not exist, the file | ||
// and it's path will be created. | ||
// If the file already exists, it will be over-written. | ||
cy | ||
// Use a response from a request to automatically | ||
// generate a fixture file for use later | ||
.request('https://jsonplaceholder.typicode.com/users').then(function(response){ | ||
// https://on.cypress.io/api/writefile | ||
// Use a response from a request to automatically | ||
// generate a fixture file for use later | ||
cy.request('https://jsonplaceholder.typicode.com/users') | ||
.then(function(response){ | ||
// https://on.cypress.io/writefile | ||
cy.writeFile('cypress/fixtures/users.json', response.body) | ||
}) | ||
.fixture('users').then(function(users){ | ||
expect(users[0].name).to.exist | ||
}) | ||
cy.fixture('users').should(function(users){ | ||
expect(users[0].name).to.exist | ||
}) | ||
cy | ||
// JavaScript arrays and objects are stringified and formatted into text. | ||
.writeFile('cypress/fixtures/profile.json', { id: 8739, name: 'Jane', email: 'jane@example.com'}) | ||
.fixture('profile').then(function(profile){ | ||
expect(profile.name).to.eq('Jane') | ||
}) | ||
// JavaScript arrays and objects are stringified and formatted into text. | ||
cy.writeFile('cypress/fixtures/profile.json', { | ||
id: 8739, | ||
name: 'Jane', | ||
email: 'jane@example.com' | ||
}) | ||
cy.fixture('profile').should(function(profile){ | ||
expect(profile.name).to.eq('Jane') | ||
}) | ||
}) | ||
}) | ||
@@ -1232,4 +1122,2 @@ | ||
}) | ||
// **** Local Storage **** | ||
// | ||
// Although local storage is automatically cleared | ||
@@ -1240,49 +1128,41 @@ // to maintain a clean state in between tests | ||
it('cy.clearLocalStorage() - clear all data in local storage', function(){ | ||
// https://on.cypress.io/clearlocalstorage | ||
cy.get('.ls-btn').click().should(function(){ | ||
expect(localStorage.getItem('prop1')).to.eq('red') | ||
expect(localStorage.getItem('prop2')).to.eq('blue') | ||
expect(localStorage.getItem('prop3')).to.eq('magenta') | ||
}) | ||
// **** Clear all data in Local Storage **** | ||
// | ||
// https://on.cypress.io/api/clearlocalstorage | ||
cy | ||
.get(".ls-btn").click().then(function(){ | ||
expect(localStorage.getItem('prop1')).to.eq('red') | ||
expect(localStorage.getItem('prop2')).to.eq('blue') | ||
expect(localStorage.getItem('prop3')).to.eq('magenta') | ||
}) | ||
// clearLocalStorage() yields the localStorage object | ||
cy.clearLocalStorage().should(function(ls){ | ||
expect(ls.getItem('prop1')).to.be.null | ||
expect(ls.getItem('prop2')).to.be.null | ||
expect(ls.getItem('prop3')).to.be.null | ||
}) | ||
// clearLocalStorage() returns the localStorage object | ||
.clearLocalStorage().then(function(ls){ | ||
expect(ls.getItem('prop1')).to.be.null | ||
expect(ls.getItem('prop2')).to.be.null | ||
expect(ls.getItem('prop3')).to.be.null | ||
}) | ||
// **** Clear key matching string in Local Storage **** | ||
// | ||
cy | ||
.get(".ls-btn").click().then(function(){ | ||
expect(localStorage.getItem('prop1')).to.eq('red') | ||
expect(localStorage.getItem('prop2')).to.eq('blue') | ||
expect(localStorage.getItem('prop3')).to.eq('magenta') | ||
}) | ||
cy.get('.ls-btn').click().should(function(){ | ||
expect(localStorage.getItem('prop1')).to.eq('red') | ||
expect(localStorage.getItem('prop2')).to.eq('blue') | ||
expect(localStorage.getItem('prop3')).to.eq('magenta') | ||
}) | ||
.clearLocalStorage('prop1').then(function(ls){ | ||
expect(ls.getItem('prop1')).to.be.null | ||
expect(ls.getItem('prop2')).to.eq('blue') | ||
expect(ls.getItem('prop3')).to.eq('magenta') | ||
}) | ||
cy.clearLocalStorage('prop1').should(function(ls){ | ||
expect(ls.getItem('prop1')).to.be.null | ||
expect(ls.getItem('prop2')).to.eq('blue') | ||
expect(ls.getItem('prop3')).to.eq('magenta') | ||
}) | ||
// **** Clear key's matching regex in Local Storage **** | ||
// | ||
cy | ||
.get(".ls-btn").click().then(function(){ | ||
expect(localStorage.getItem('prop1')).to.eq('red') | ||
expect(localStorage.getItem('prop2')).to.eq('blue') | ||
expect(localStorage.getItem('prop3')).to.eq('magenta') | ||
}) | ||
cy.get('.ls-btn').click().should(function(){ | ||
expect(localStorage.getItem('prop1')).to.eq('red') | ||
expect(localStorage.getItem('prop2')).to.eq('blue') | ||
expect(localStorage.getItem('prop3')).to.eq('magenta') | ||
}) | ||
.clearLocalStorage(/prop1|2/).then(function(ls){ | ||
expect(ls.getItem('prop1')).to.be.null | ||
expect(ls.getItem('prop2')).to.be.null | ||
expect(ls.getItem('prop3')).to.eq('magenta') | ||
}) | ||
cy.clearLocalStorage(/prop1|2/).should(function(ls){ | ||
expect(ls.getItem('prop1')).to.be.null | ||
expect(ls.getItem('prop2')).to.be.null | ||
expect(ls.getItem('prop3')).to.eq('magenta') | ||
}) | ||
}) | ||
@@ -1299,107 +1179,74 @@ }) | ||
// any 3rd party cookies picked up such as cloudflare | ||
.clearCookies() | ||
cy.clearCookies() | ||
}) | ||
it('cy.getCookie() - get a browser cookie', function(){ | ||
// https://on.cypress.io/getcookie | ||
cy.get('#getCookie .set-a-cookie').click() | ||
// **** Get a Cookie **** | ||
// | ||
// // https://on.cypress.io/api/getcookie | ||
cy | ||
.get('#getCookie .set-a-cookie').click() | ||
// getCookie() returns a cookie object | ||
.getCookie('token').should('have.property', 'value', '123ABC') | ||
// cy.getCookie() yields a cookie object | ||
cy.getCookie('token').should('have.property', 'value', '123ABC') | ||
}) | ||
it('cy.getCookies() - get browser cookies', function(){ | ||
// https://on.cypress.io/getcookies | ||
cy.getCookies().should('be.empty') | ||
// **** Get all Cookies **** | ||
// | ||
// // https://on.cypress.io/api/getcookies | ||
cy | ||
.getCookies().should('be.empty') | ||
cy.get('#getCookies .set-a-cookie').click() | ||
.get('#getCookies .set-a-cookie').click() | ||
// cy.getCookies() yields an array of cookies | ||
cy.getCookies().should('have.length', 1).should( function(cookies) { | ||
// getCookies() returns an array of cookies | ||
.getCookies().should('have.length', 1).then( function(cookies) { | ||
// each cookie has these properties | ||
expect(cookies[0]).to.have.property('name', 'token') | ||
expect(cookies[0]).to.have.property('value', '123ABC') | ||
expect(cookies[0]).to.have.property('httpOnly', false) | ||
expect(cookies[0]).to.have.property('secure', false) | ||
expect(cookies[0]).to.have.property('domain') | ||
expect(cookies[0]).to.have.property('path') | ||
}) | ||
// each cookie has these properties | ||
expect(cookies[0]).to.have.property('name', 'token') | ||
expect(cookies[0]).to.have.property('value', '123ABC') | ||
expect(cookies[0]).to.have.property('httpOnly', false) | ||
expect(cookies[0]).to.have.property('secure', false) | ||
expect(cookies[0]).to.have.property('domain') | ||
expect(cookies[0]).to.have.property('path') | ||
}) | ||
}) | ||
it('cy.setCookie() - set a browser cookie', function(){ | ||
// https://on.cypress.io/setcookie | ||
cy.getCookies().should('be.empty') | ||
// **** Set a Cookie **** | ||
// | ||
// // https://on.cypress.io/api/setcookie | ||
cy | ||
.getCookies().should('be.empty') | ||
cy.setCookie('foo', 'bar') | ||
.setCookie('foo', 'bar') | ||
// getCookie() returns a cookie object | ||
.getCookie('foo').should('have.property', 'value', 'bar') | ||
// cy.getCookie() yields a cookie object | ||
cy.getCookie('foo').should('have.property', 'value', 'bar') | ||
}) | ||
it('cy.clearCookie() - clear a browser cookie', function(){ | ||
// https://on.cypress.io/clearcookie | ||
cy.getCookie('token').should('be.null') | ||
// **** Clear a Cookie **** | ||
// | ||
// // https://on.cypress.io/api/clearcookie | ||
cy | ||
.getCookie('token').should('be.null') | ||
cy.get('#clearCookie .set-a-cookie').click() | ||
.get('#clearCookie .set-a-cookie').click() | ||
cy.getCookie('token').should('have.property', 'value', '123ABC') | ||
.getCookie('token').should('have.property', 'value', '123ABC') | ||
// cy.clearCookies() yields null | ||
cy.clearCookie('token').should('be.null') | ||
// clearCookies() returns null | ||
.clearCookie('token').should('be.null') | ||
.getCookie('token').should('be.null') | ||
cy.getCookie('token').should('be.null') | ||
}) | ||
it('cy.clearCookies() - clear browser cookies', function(){ | ||
// https://on.cypress.io/clearcookies | ||
cy.getCookies().should('be.empty') | ||
// **** Clear all Cookies **** | ||
// | ||
// https://on.cypress.io/api/clearcookies | ||
cy.get('#clearCookies .set-a-cookie').click() | ||
cy | ||
.getCookies().should('be.empty') | ||
cy.getCookies().should('have.length', 1) | ||
.get('#clearCookies .set-a-cookie').click() | ||
// cy.clearCookies() yields null | ||
cy.clearCookies() | ||
.getCookies().should('have.length', 1) | ||
// clearCookies() returns null | ||
.clearCookies() | ||
.getCookies().should('be.empty') | ||
cy.getCookies().should('be.empty') | ||
}) | ||
}) | ||
context('Spies, Stubs, and Clock', function(){ | ||
// **** Spies, Stubs, and Clock **** | ||
// | ||
// Cypress comes built in with the ability to stub, | ||
// spy or modify your applications clock - | ||
// such as controlling Date, setTimeout, and setInterval. | ||
// These commands are useful when writing both | ||
// unit tests and integration tests. | ||
it('cy.spy() - wrap a method in a spy', function(){ | ||
// https://on.cypress.io/api/spy | ||
// https://on.cypress.io/spy | ||
cy.visit('http://localhost:8080/commands/spies-stubs-clocks') | ||
@@ -1411,3 +1258,3 @@ | ||
var spy = cy.spy(obj, "foo").as("anyArgs") | ||
var spy = cy.spy(obj, 'foo').as('anyArgs') | ||
@@ -1421,4 +1268,3 @@ obj.foo() | ||
it('cy.stub() - create a stub and/or replace a function with a stub', function(){ | ||
// https://on.cypress.io/api/stub | ||
// https://on.cypress.io/stub | ||
cy.visit('http://localhost:8080/commands/spies-stubs-clocks') | ||
@@ -1430,5 +1276,5 @@ | ||
var stub = cy.stub(obj, "foo").as("foo") | ||
var stub = cy.stub(obj, 'foo').as('foo') | ||
obj.foo("foo", "bar") | ||
obj.foo('foo', 'bar') | ||
@@ -1442,11 +1288,9 @@ expect(stub).to.be.called | ||
// no matter what local timezone the browser is running in | ||
var now = new Date(Date.UTC(2017, 2, 14)).getTime() // March 14, 2017 timestamp | ||
var now = new Date(Date.UTC(2017, 2, 14)).getTime() | ||
// https://on.cypress.io/api/clock | ||
cy | ||
.clock(now) | ||
.visit('http://localhost:8080/commands/spies-stubs-clocks') | ||
.get("#clock-div").click() | ||
.should("have.text", "1489449600") | ||
// https://on.cypress.io/clock | ||
cy.clock(now) | ||
cy.visit('http://localhost:8080/commands/spies-stubs-clocks') | ||
cy.get('#clock-div').click() | ||
.should('have.text', '1489449600') | ||
}) | ||
@@ -1457,14 +1301,12 @@ | ||
// no matter what local timezone the browser is running in | ||
var now = new Date(Date.UTC(2017, 2, 14)).getTime() // March 14, 2017 timestamp | ||
var now = new Date(Date.UTC(2017, 2, 14)).getTime() | ||
// https://on.cypress.io/api/tick | ||
cy | ||
.clock(now) | ||
.visit('http://localhost:8080/commands/spies-stubs-clocks') | ||
.get("#tick-div").click() | ||
.should("have.text", "1489449600") | ||
.tick(10000) // 10 seconds passed | ||
.get("#tick-div").click() | ||
.should("have.text", "1489449610") | ||
// https://on.cypress.io/tick | ||
cy.clock(now) | ||
cy.visit('http://localhost:8080/commands/spies-stubs-clocks') | ||
cy.get('#tick-div').click() | ||
.should('have.text', '1489449600') | ||
cy.tick(10000) // 10 seconds passed | ||
cy.get('#tick-div').click() | ||
.should('have.text', '1489449610') | ||
}) | ||
@@ -1478,17 +1320,9 @@ }) | ||
// **** Utilities **** | ||
// | ||
// Cypress offers some utilities commands | ||
// that give you access to methods from other | ||
// commonly used libraries | ||
it('Cypress._.method() - call a lodash method', function(){ | ||
// use the _.chain, _.map, _.take, and _.value functions | ||
// https://on.cypress.io/_ | ||
cy.request('https://jsonplaceholder.typicode.com/users') | ||
.then(function(response){ | ||
var ids = Cypress._.chain(response.body).map('id').take(3).value() | ||
it('Cypress._.method() - call an underscore method', function(){ | ||
cy | ||
// use the _.chain, _.pluck, _.first, and _.value functions | ||
// https://on.cypress.io/api/cypress-underscore | ||
.request('https://jsonplaceholder.typicode.com/users').then(function(response){ | ||
var _ = Cypress._ | ||
var ids = _.chain(response.body).pluck('id').first(3).value() | ||
expect(ids).to.deep.eq([1, 2, 3]) | ||
@@ -1499,43 +1333,39 @@ }) | ||
it('Cypress.$(selector) - call a jQuery method', function(){ | ||
// https://on.cypress.io/api/cypress-jquery | ||
// https://on.cypress.io/$ | ||
var $li = Cypress.$('.utility-jquery li:first') | ||
cy | ||
.wrap($li) | ||
.should('not.have.class', 'active') | ||
cy.wrap($li) | ||
.should('not.have.class', 'active') | ||
.click() | ||
.should('have.class', 'active') | ||
.should('have.class', 'active') | ||
}) | ||
it('Cypress.moment() - format or parse dates using a moment method', function(){ | ||
// use moment's format function | ||
// https://on.cypress.io/api/cypress-moment | ||
// https://on.cypress.io/cypress-moment | ||
// eslint-disable-next-line no-unused-vars | ||
var time = Cypress.moment().utc('2014-04-25T19:38:53.196Z').format('h:mm A') | ||
cy | ||
.get('.utility-moment').contains('3:38 PM') | ||
.should('have.class', 'badge') | ||
cy.get('.utility-moment').contains('3:38 PM') | ||
.should('have.class', 'badge') | ||
}) | ||
it('Cypress.Blob.method() - blob utilities and base64 string conversion', function(){ | ||
// https://on.cypress.io/api/cypress-blob | ||
// https://github.com/nolanlawson/blob-util#imgSrcToDataURL | ||
// get the dataUrl string for the javascript-logo | ||
return Cypress.Blob.imgSrcToDataURL('/assets/img/javascript-logo.png', undefined, 'anonymous') | ||
.then(function(dataUrl){ | ||
// create an <img> element and set its src to the dataUrl | ||
var img = Cypress.$('<img />', {src: dataUrl}) | ||
// need to explicitly return cy here since we are initially returning | ||
// the Cypress.Blog.imgSrcToDataURL promise to our test | ||
return cy | ||
.get('.utility-blob').then(function($div){ | ||
cy.get('.utility-blob').then(function($div){ | ||
// https://on.cypress.io/blob | ||
// https://github.com/nolanlawson/blob-util#imgSrcToDataURL | ||
// get the dataUrl string for the javascript-logo | ||
return Cypress.Blob.imgSrcToDataURL('/assets/img/javascript-logo.png', undefined, 'anonymous') | ||
.then(function(dataUrl){ | ||
// create an <img> element and set its src to the dataUrl | ||
var img = Cypress.$('<img />', {src: dataUrl}) | ||
// need to explicitly return cy here since we are initially returning | ||
// the Cypress.Blob.imgSrcToDataURL promise to our test | ||
// append the image | ||
$div.append(img) | ||
cy.get('.utility-blob img').click() | ||
.should('have.attr', 'src', dataUrl) | ||
}) | ||
.get('.utility-blob img').click().should('have.attr', 'src', dataUrl) | ||
}) | ||
@@ -1545,4 +1375,3 @@ }) | ||
it('new Cypress.Promise(function) - instantiate a bluebird promise', function(){ | ||
// https://on.cypress.io/api/cypress-promise | ||
// https://on.cypress.io/promise | ||
var waited = false | ||
@@ -1552,2 +1381,3 @@ | ||
// return a promise that resolves after 1 second | ||
// eslint-disable-next-line no-unused-vars | ||
return new Cypress.Promise(function(resolve, reject){ | ||
@@ -1564,13 +1394,11 @@ setTimeout(function(){ | ||
cy | ||
.then(function(){ | ||
// return a promise to cy.then() that | ||
// is awaited until it resolves | ||
return waitOneSecond().then(function(str){ | ||
expect(str).to.eq('foo') | ||
expect(waited).to.be.true | ||
}) | ||
cy.then(function(){ | ||
// return a promise to cy.then() that | ||
// is awaited until it resolves | ||
return waitOneSecond().then(function(str){ | ||
expect(str).to.eq('foo') | ||
expect(waited).to.be.true | ||
}) | ||
}) | ||
}) | ||
}) | ||
@@ -1584,8 +1412,4 @@ | ||
// **** Config **** | ||
// | ||
it('Cypress.config() - get and set configuration options', function(){ | ||
// https://on.cypress.io/api/config | ||
// https://on.cypress.io/config | ||
var myConfig = Cypress.config() | ||
@@ -1603,9 +1427,5 @@ | ||
// *** get a single configuration option ** | ||
expect(Cypress.config('pageLoadTimeout')).to.eq(60000) | ||
// *** set a single configuration option ** | ||
// | ||
// this will change the config for the rest of your tests! | ||
// | ||
Cypress.config('pageLoadTimeout', 20000) | ||
@@ -1624,15 +1444,11 @@ | ||
// **** Env **** | ||
// | ||
// We can set environment variables for highly dynamic values | ||
// | ||
// https://on.cypress.io/guides/environment-variables | ||
it('Cypress.env() - get the environment variables', function(){ | ||
// https://on.cypress.io/api/env | ||
// https://on.cypress.io/environment-variables | ||
it('Cypress.env() - get environment variables', function(){ | ||
// https://on.cypress.io/env | ||
// set multiple environment variables | ||
Cypress.env({ | ||
host: 'veronica.dev.local', | ||
api_server: 'http://localhost:8888/api/v1/' | ||
api_server: 'http://localhost:8888/v1/' | ||
}) | ||
@@ -1644,8 +1460,8 @@ | ||
// set environment variable | ||
Cypress.env('api_server', 'http://localhost:8888/api/v2/') | ||
expect(Cypress.env('api_server')).to.eq('http://localhost:8888/api/v2/') | ||
Cypress.env('api_server', 'http://localhost:8888/v2/') | ||
expect(Cypress.env('api_server')).to.eq('http://localhost:8888/v2/') | ||
// get all environment variable | ||
expect(Cypress.env()).to.have.property('host', 'veronica.dev.local') | ||
expect(Cypress.env()).to.have.property('api_server', 'http://localhost:8888/api/v2/') | ||
expect(Cypress.env()).to.have.property('api_server', 'http://localhost:8888/v2/') | ||
}) | ||
@@ -1659,10 +1475,4 @@ }) | ||
// **** Cookies **** | ||
// | ||
// Manage your app's cookies while testing | ||
// | ||
// https://on.cypress.io/api/cookies | ||
// https://on.cypress.io/cookies | ||
it('Cypress.Cookies.debug() - enable or disable debugging', function(){ | ||
Cypress.Cookies.debug(true) | ||
@@ -1680,3 +1490,2 @@ | ||
it('Cypress.Cookies.preserveOnce() - preserve cookies by key', function(){ | ||
// normally cookies are reset after each test | ||
@@ -1692,3 +1501,2 @@ cy.getCookie('fakeCookie').should('not.be.ok') | ||
it('Cypress.Cookies.defaults() - set defaults for all cookies', function(){ | ||
// now any cookie with the name 'session_id' will | ||
@@ -1702,3 +1510,3 @@ // not be cleared before each new test runs | ||
context('Cypress.Dom', function(){ | ||
context('Cypress.dom', function(){ | ||
beforeEach(function(){ | ||
@@ -1708,10 +1516,4 @@ cy.visit('http://localhost:8080/cypress-api/dom') | ||
// **** Dom **** | ||
// | ||
// Cypress.Dom holds methods and logic related to DOM. | ||
// | ||
// https://on.cypress.io/api/dom | ||
it('Cypress.Dom.isHidden() - determine if a DOM element is hidden', function(){ | ||
// https://on.cypress.io/dom | ||
it('Cypress.dom.isHidden() - determine if a DOM element is hidden', function(){ | ||
var hiddenP = Cypress.$('.dom-p p.hidden').get(0) | ||
@@ -1721,4 +1523,4 @@ var visibleP = Cypress.$('.dom-p p.visible').get(0) | ||
// our first paragraph has css class 'hidden' | ||
expect(Cypress.Dom.isHidden(hiddenP)).to.be.true | ||
expect(Cypress.Dom.isHidden(visibleP)).to.be.false | ||
expect(Cypress.dom.isHidden(hiddenP)).to.be.true | ||
expect(Cypress.dom.isHidden(visibleP)).to.be.false | ||
}) | ||
@@ -1732,9 +1534,6 @@ }) | ||
// **** Server **** | ||
// | ||
// Permanently override server options for | ||
// all instances of cy.server() | ||
// | ||
// https://on.cypress.io/api/api-server | ||
// https://on.cypress.io/cypress-server | ||
it('Cypress.Server.defaults() - change default config of server', function(){ | ||
@@ -1744,2 +1543,3 @@ Cypress.Server.defaults({ | ||
force404: false, | ||
// eslint-disable-next-line no-unused-vars | ||
whitelist: function(xhr){ | ||
@@ -1746,0 +1546,0 @@ // handle custom logic for whitelisting |
// *********************************************** | ||
// This example commands.js shows you how to | ||
// create the custom command: 'login'. | ||
// | ||
// The commands.js file is a great place to | ||
@@ -10,10 +7,10 @@ // modify existing commands and create custom | ||
// You can read more about custom commands here: | ||
// https://on.cypress.io/api/commands | ||
// https://on.cypress.io/commands | ||
// *********************************************** | ||
// | ||
// Cypress.addParentCommand("login", function(email, password){ | ||
// Cypress.Command.add("login", function(email, password){ | ||
// var email = email || "joe@example.com" | ||
// var password = password || "foobar" | ||
// | ||
// var log = Cypress.Log.command({ | ||
// var log = Cypress.log({ | ||
// name: "login", | ||
@@ -29,13 +26,17 @@ // message: [email, password], | ||
// | ||
// cy | ||
// .visit("/login", {log: false}) | ||
// .contains("Log In", {log: false}) | ||
// .get("#email", {log: false}).type(email, {log: false}) | ||
// .get("#password", {log: false}).type(password, {log: false}) | ||
// .get("button", {log: false}).click({log: false}) //this should submit the form | ||
// .get("h1", {log: false}).contains("Dashboard", {log: false}) //we should be on the dashboard now | ||
// .url({log: false}).should("match", /dashboard/, {log: false}) | ||
// cy.visit("/login", {log: false}) | ||
// cy.contains("Log In", {log: false}) | ||
// cy.get("#email", {log: false}) | ||
// .type(email, {log: false}) | ||
// cy.get("#password", {log: false}) | ||
// .type(password, {log: false}) | ||
// cy.get("button", {log: false}) | ||
// .click({log: false}) // this should submit the form | ||
// cy.get("h1", {log: false}) | ||
// .contains("Dashboard", {log: false}) // we should be on the dashboard now | ||
// cy.url({log: false}) | ||
// .should("match", /dashboard/, {log: false}) | ||
// .then(function(){ | ||
// log.snapshot().end() | ||
// }) | ||
// }) | ||
// }) |
// *********************************************** | ||
// This example defaults.js shows you how to | ||
// customize the internal behavior of Cypress. | ||
// | ||
// The defaults.js file is a great place to | ||
// override defaults used throughout all tests. | ||
// | ||
// *********************************************** | ||
@@ -17,2 +13,2 @@ // | ||
// whitelist: ["session_id", "remember_token"] | ||
// }) | ||
// }) |
// *********************************************************** | ||
// This example support/index.js is processed and | ||
// loaded automatically before your other test files. | ||
// This file is loaded automatically before other test files. | ||
// | ||
@@ -13,3 +12,3 @@ // This is a great place to put global configuration and | ||
// You can read more here: | ||
// https://on.cypress.io/guides/configuration#section-global | ||
// https://on.cypress.io/configuration | ||
// *********************************************************** | ||
@@ -19,4 +18,4 @@ | ||
// using ES2015 syntax: | ||
import "./commands" | ||
import "./defaults" | ||
import './commands' | ||
import './defaults' | ||
@@ -23,0 +22,0 @@ // Alternatively you can use CommonJS syntax: |
{ | ||
"name": "cypress-example-kitchensink", | ||
"version": "0.7.0", | ||
"version": "0.7.1-dev.20170910.193949", | ||
"description": "This is an example app used to showcase Cypress.io testing. For a full reference of our documentation, go to docs.cypress.io", | ||
@@ -10,3 +10,5 @@ "main": "index.js", | ||
"release": "releaser", | ||
"test": "npm start & cypress run" | ||
"test": "npm start & cypress run", | ||
"pretest": "npm run lint", | ||
"lint": "eslint --fix cypress/**/*.js" | ||
}, | ||
@@ -27,4 +29,7 @@ "repository": { | ||
"devDependencies": { | ||
"@cypress/core-releaser": "0.1.8" | ||
"@cypress/releaser": "0.2.1", | ||
"cypress": "dev", | ||
"eslint": "^4.0.0", | ||
"stop-build": "^1.1.0" | ||
} | ||
} |
@@ -30,3 +30,3 @@ # Kitchen Sink [![Circle CI](https://circleci.com/gh/cypress-io/cypress-example-kitchensink.svg?style=svg)](https://circleci.com/gh/cypress-io/cypress-example-kitchensink) [![Travis CI](https://travis-ci.org/cypress-io/cypress-example-kitchensink.svg?branch=master)](https://travis-ci.org/cypress-io/cypress-example-kitchensink) | ||
* [Gitter Channel](https://gitter.im/cypress-io/cypress) | ||
* [Gitter Chat](https://gitter.im/cypress-io/cypress) | ||
* [Cypress Docs](https://on.cypress.io) | ||
@@ -33,0 +33,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
2266078
4
2730