Best JavaScript code snippet using cypress
we-retail-instore.js
Source: we-retail-instore.js
...74 .addTestCase(new hobs.TestCase('Switch catalog', {demoMode: DEBUG})75 // Check the initial catalog is visible76 .asserts.isVisible([selectors.catalog.cover.view,77 selectors.catalog.cover.background + selectors.catalog.cover.demo].join(' '))78 .asserts.isInViewport([selectors.catalog.cover.view,79 selectors.catalog.cover.background + selectors.catalog.cover.demo].join(' '))80 .execSyncFct(function() {81 cache.currentCatalog = hobs.find(selectors.catalog.cover.view + ':last');82 cache.initialCatalog = cache.currentCatalog;83 cache.previousCatalog = cache.currentCatalog;84 })85 // Swipe to another catalog86 .sistine.swipeUp(selectors.catalog.cover.view + ':last')87 .asserts.isInViewport([selectors.catalog.cover.view,88 selectors.catalog.cover.background + selectors.catalog.cover.demo].join(' '), false)89 .asserts.isVisible(selectors.catalog.cover.view)90 .asserts.isInViewport(selectors.catalog.cover.view + ':last')91 .asserts.isTrue(function() {92 cache.currentCatalog = hobs.find(selectors.catalog.cover.view + ':last');93 return cache.previousCatalog.get(0) !== cache.currentCatalog.get(0);94 })95 .execSyncFct(function() {96 cache.previousCatalog = cache.currentCatalog;97 })98 // Swipe back to the initial catalog99 .sistine.swipeDown(selectors.catalog.cover.view + ':last')100 .asserts.isVisible(selectors.catalog.cover.view + ':first')101 .asserts.isInViewport([selectors.catalog.cover.view,102 selectors.catalog.cover.background + ':not(' + selectors.catalog.cover.demo + ')'].join(' '), false)103 .asserts.isVisible([selectors.catalog.cover.view,104 selectors.catalog.cover.background + selectors.catalog.cover.demo].join(' '))105 .asserts.isInViewport([selectors.catalog.cover.view,106 selectors.catalog.cover.background + selectors.catalog.cover.demo].join(' '))107 .asserts.isTrue(function() {108 cache.currentCatalog = hobs.find(selectors.catalog.cover.view + ':last');109 return cache.previousCatalog.get(0) !== cache.currentCatalog.get(0)110 && cache.currentCatalog.get(0) === cache.initialCatalog.get(0);111 })112 )113 // It should be possible to toggle the callouts when tapping the buttons114 .addTestCase(new hobs.TestCase('Toggle product callouts', {demoMode: DEBUG})115 // There should be buttons and callouts on the current catalog, and the callouts should be hidden116 .asserts.exists([selectors.catalog.current, selectors.product.callout.view].join(' '))117 .asserts.exists([selectors.catalog.current, selectors.product.callout.button].join(' '))118 .asserts.isVisible(selectors.product.callout.view, false)119 .asserts.isTrue(function() {120 return hobs.find(selectors.product.callout.view).length >= 2;121 })122 // Tapping a callout should show it123 .sistine.tap(selectors.product.callout.button + ':eq(0)')124 .asserts.isVisible(selectors.product.callout.view + ':eq(0)')125 // Tapping it again should close it126 .sistine.tap(selectors.product.callout.button + ':eq(0)')127 .asserts.isVisible(selectors.product.callout.view + ':eq(0)', false)128 // Tapping a second callout when one is already open should close it129 .sistine.tap(selectors.product.callout.button + ':eq(0)')130 .asserts.isVisible(selectors.product.callout.view + ':eq(0)')131 .sistine.tap(selectors.product.callout.button + ':eq(1)')132 .asserts.isVisible(selectors.product.callout.view + ':eq(0)', false)133 .asserts.isVisible(selectors.product.callout.view + ':eq(1)')134 .sistine.tap(selectors.product.callout.button + ':eq(1)')135 .asserts.isVisible(selectors.product.callout.view + ':eq(1)', false)136 )137 // Position on the right category for the rest of the test cases138 .addTestCase(new hobs.TestCase('Select a specific product category', {demoMode: DEBUG})139 // Position on the right category140 .asserts.exists([selectors.catalog.current, selectors.catalog.cover.view].join(' '))141 .sistine.swipeLeft([selectors.catalog.current, selectors.catalog.cover.view].join(' '))142 .asserts.isInViewport([selectors.catalog.current, selectors.catalog.cover.view].join(' '), false)143 .asserts.isVisible([selectors.catalog.current, selectors.category.view].join(' ') + ':lt(2)')144 .asserts.isInViewport([selectors.catalog.current, selectors.category.view].join(' ') + ':lt(2)')145 .sistine.swipeLeft([selectors.catalog.current, selectors.catalog.cover.view].join(' '))146 .asserts.isVisible([selectors.catalog.current, selectors.category.view].join(' ') + ':gt(0):lt(2)')147 .asserts.isInViewport([selectors.catalog.current, selectors.category.view].join(' ') + ':gt(0):lt(2)')148 .sistine.swipeLeft([selectors.catalog.current, selectors.catalog.cover.view].join(' '))149 .asserts.isVisible([selectors.catalog.current, selectors.category.view].join(' ') + ':gt(1):lt(3)')150 .asserts.isInViewport([selectors.catalog.current, selectors.category.view].join(' ') + ':gt(1):lt(2)')151 .asserts.exists([selectors.catalog.current, selectors.category.view].join(' ') + ':eq(3) ' +152 selectors.product.demo)153 )154 // It should be possible to swipe up and down between products155 .addTestCase(new hobs.TestCase('Switch product', {demoMode: DEBUG})156 // Check initial product is visible157 .asserts.isVisible(158 [selectors.product.view, selectors.product.thumbnail + selectors.product.demo].join(' '))159 .asserts.isInViewport(160 [selectors.product.view, selectors.product.thumbnail + selectors.product.demo].join(' '))161 .execSyncFct(function() {162 cache.currentProduct = hobs.find([selectors.catalog.current, selectors.category.view + ':eq(3)',163 selectors.product.current].join(' '));164 cache.initialProduct = cache.currentProduct;165 cache.previousProduct = cache.currentProduct;166 })167 // Swipe to another product168 .sistine.swipeUp([selectors.product.view, selectors.product.thumbnail + selectors.product.demo].join(' '))169 .asserts.isTrue(function() {170 cache.currentProduct = hobs.find([selectors.catalog.current, selectors.category.view + ':eq(3)',171 selectors.product.current].join(' '));172 return cache.previousProduct.get(0) !== cache.currentProduct.get(0);173 })174 .execSyncFct(function() {175 cache.previousProduct = cache.currentProduct;176 })177 .asserts.isInViewport(178 [selectors.product.view, selectors.product.thumbnail + selectors.product.demo].join(' '), false)179 // Sipw back to the initial product180 .sistine.swipeDown([selectors.product.view, selectors.product.thumbnail + selectors.product.demo].join(' '))181 .asserts.isInViewport(182 [selectors.product.view, selectors.product.thumbnail + selectors.product.demo].join(' '))183 .asserts.isTrue(function() {184 cache.currentProduct = hobs.find([selectors.catalog.current, selectors.category.view + ':eq(3)',185 selectors.product.current].join(' '));186 return cache.previousProduct.get(0) !== cache.currentProduct.get(0)187 && cache.currentProduct.get(0) === cache.initialProduct.get(0);188 })189 )190 // Double-tapping should toggle the fullscreen view for the product191 .addTestCase(new hobs.TestCase('Open fullscreen product', {demoMode: DEBUG})192 // Open the product fullscreen view193 .asserts.isVisible(194 [selectors.product.view, selectors.product.thumbnail + selectors.product.demo].join(' '))195 .asserts.isInViewport(196 [selectors.product.view, selectors.product.thumbnail + selectors.product.demo].join(' '))197 .sistine.doubletap([selectors.product.view, selectors.product.thumbnail + selectors.product.demo].join(' '))198 .asserts.exists(selectors.product.fullscreen.view)199 .asserts.exists(selectors.product.fullscreen.bigThumbnail)200 .asserts.exists(selectors.product.fullscreen.smallThumbnail)201 .asserts.exists(selectors.product.fullscreen.description)202 .asserts.exists(selectors.product.fullscreen.button)203 .asserts.isVisible(selectors.product.fullscreen.view)204 // The selected product in the fullscreen view is the right one205 .asserts.isVisible(selectors.product.fullscreen.smallThumbnail)206 .asserts.isInViewport(selectors.product.fullscreen.smallThumbnail + selectors.product.demo)207 .asserts.hasCssClass(selectors.product.fullscreen.smallThumbnail + selectors.product.demo, 'active')208 .asserts.isVisible(selectors.product.fullscreen.bigThumbnail)209 .asserts.isInViewport(selectors.product.fullscreen.bigThumbnail + selectors.product.demo)210 )211 // Tapping one of the small thumbnails should change the product in the view212 .addTestCase(new hobs.TestCase('Change product', {demoMode: DEBUG})213 .asserts.exists(selectors.product.fullscreen.smallThumbnail + ':eq(1)')214 .sistine.tap(selectors.product.fullscreen.smallThumbnail + ':eq(1)')215 .asserts.hasCssClass(selectors.product.fullscreen.smallThumbnail + ':eq(0)', 'active', false)216 .asserts.hasCssClass(selectors.product.fullscreen.smallThumbnail + ':eq(1)', 'active')217 .asserts.isTrue(function() {218 var $smallThumbnails = hobs.find(selectors.product.fullscreen.smallThumbnail);219 var $bigThumbnail = hobs.find(selectors.product.fullscreen.bigThumbnail);220 return $smallThumbnails.eq(1).attr('data-path') === $bigThumbnail.attr('data-path');221 })222 .wait(300)223 )224 // Tapping the menu icon should toggle the product details225 .addTestCase(new hobs.TestCase('Toggle product details', {demoMode: DEBUG})226 // The description panel should be hidden by default227 .asserts.isVisible(selectors.product.fullscreen.button)228 .asserts.isInViewport(selectors.product.fullscreen.button)229 .asserts.isVisible(selectors.product.fullscreen.description)230 .asserts.isInViewport(selectors.product.fullscreen.description, false)231 // Tapping the menu icon should show the description panel232 .sistine.tap(selectors.product.fullscreen.button)233 .asserts.isVisible(selectors.product.fullscreen.button)234 .asserts.isInViewport(selectors.product.fullscreen.button)235 .asserts.isVisible(selectors.product.fullscreen.description)236 .asserts.isInViewport(selectors.product.fullscreen.description)237 // Tapping the menu icon again should show hide description panel238 .sistine.tap(selectors.product.fullscreen.button)239 .asserts.isVisible(selectors.product.fullscreen.button)240 .asserts.isInViewport(selectors.product.fullscreen.button)241 .asserts.isInViewport(selectors.product.fullscreen.description, false)242 )243 // Double-tapping the big thumbnail should close the fullscreen view244 .addTestCase(new hobs.TestCase('Close category', {demoMode: DEBUG})245 .asserts.isVisible(selectors.product.fullscreen.view)246 .asserts.isInViewport(selectors.product.fullscreen.view)247 .sistine.doubletap(selectors.product.fullscreen.bigThumbnail)248 .asserts.isVisible(selectors.product.fullscreen.view, false)249 .asserts.isInViewport(selectors.product.fullscreen.view, false)250 // The visible product should now match the one that was selected in the fullscreen view251 .asserts.isInViewport(252 [selectors.product.view, selectors.product.thumbnail + selectors.product.demo].join(' '), false)253 )254 // Swiping right should bring you back to the catalog cover255 .addTestCase(new hobs.TestCase('Switch to catalog cover', {demoMode: DEBUG})256 .asserts.isInViewport([selectors.catalog.current, selectors.catalog.cover.view].join(' '), false)257 .asserts.isVisible([selectors.catalog.current, selectors.category.view + ':gt(1):lt(3)'].join(' '))258 .asserts.isInViewport([selectors.catalog.current, selectors.category.view + ':gt(1):lt(2)'].join(' '))259 .sistine.swipeRight([selectors.catalog.current, selectors.category.view].join(' '))260 .asserts.isVisible([selectors.catalog.current, selectors.category.view + ':gt(0):lt(2)'].join(' '))261 .asserts.isInViewport([selectors.catalog.current, selectors.category.view + ':gt(0):lt(2)'].join(' '))262 .sistine.swipeRight([selectors.catalog.current, selectors.category.view].join(' '))263 .asserts.isVisible([selectors.catalog.current, selectors.category.view + ':lt(2)'].join(' '))264 .asserts.isInViewport([selectors.catalog.current, selectors.category.view + ':lt(2)'].join(' '))265 .sistine.swipeRight([selectors.catalog.current, selectors.category.view].join(' '))266 .asserts.isInViewport([selectors.catalog.current, selectors.category.view].join(' '), false)267 .asserts.isInViewport([selectors.catalog.current, selectors.catalog.cover.view].join(' '))268 )269 ;...
ConsultationCareAndConcealerRecommendation.spec.js
1/**2 * @prettier3 */4import React from 'react';5import {expect} from 'chai';6import {shallow} from 'enzyme';7import {ConsultationCareAndConcealerRecommendation} from '../../src/js/components/react/ConsultationCareAndConcealerRecommendation';8import {careProducts} from '../stubs/consultation-products';9describe('Component: <ConsultationCareAndConcealerRecommendation />', () => {10 it('renders a title for the collection', () => {11 const reason = 'Foo bar baz';12 const handleClick = () => {};13 const isInViewport = false;14 const stopWatcher = () => {};15 const title = 'Foo bar';16 const wrapper = shallow(17 <ConsultationCareAndConcealerRecommendation18 handleClick={handleClick}19 isInViewport={isInViewport}20 reason={reason}21 products={careProducts}22 stopWatcher={stopWatcher}23 title={title}24 />25 );26 const actual = wrapper.find('.qa-title').text();27 const expected = title;28 expect(actual).to.equal(expected);29 });30 it('renders a subtitle for the collection', () => {31 const reason = 'Foo bar baz';32 const handleClick = () => {};33 const isInViewport = false;34 const stopWatcher = () => {};35 const subtitle = 'Foo bar baz';36 const title = 'Foo bar';37 const wrapper = shallow(38 <ConsultationCareAndConcealerRecommendation39 handleClick={handleClick}40 isInViewport={isInViewport}41 reason={reason}42 products={careProducts}43 stopWatcher={stopWatcher}44 subtitle={subtitle}45 title={title}46 />47 );48 const actual = wrapper.find('.qa-subtitle').text();49 const expected = subtitle;50 expect(actual).to.equal(expected);51 });52 it('renders a reason for the recommendation', () => {53 const reason = 'Foo bar baz';54 const handleClick = () => {};55 const isInViewport = false;56 const stopWatcher = () => {};57 const title = 'Foo bar';58 const wrapper = shallow(59 <ConsultationCareAndConcealerRecommendation60 handleClick={handleClick}61 isInViewport={isInViewport}62 reason={reason}63 products={careProducts}64 stopWatcher={stopWatcher}65 title={title}66 />67 );68 const actual = wrapper.find('.qa-reason').text();69 const expected = reason;70 expect(actual).to.equal(expected);71 });72 it('renders each product in a grid', () => {73 const reason = 'Foo bar baz';74 const handleClick = () => {};75 const isInViewport = false;76 const stopWatcher = () => {};77 const title = 'Foo bar';78 const wrapper = shallow(79 <ConsultationCareAndConcealerRecommendation80 handleClick={handleClick}81 isInViewport={isInViewport}82 reason={reason}83 products={careProducts}84 stopWatcher={stopWatcher}85 title={title}86 />87 );88 const actual = wrapper.find('.o-layout__item').length;89 const expected = careProducts.length;90 expect(actual).to.equal(expected);91 });92 it("renders the product's title", () => {93 const reason = 'Foo bar baz';94 const handleClick = () => {};95 const isInViewport = false;96 const stopWatcher = () => {};97 const title = 'Foo bar';98 const wrapper = shallow(99 <ConsultationCareAndConcealerRecommendation100 handleClick={handleClick}101 isInViewport={isInViewport}102 reason={reason}103 products={careProducts}104 stopWatcher={stopWatcher}105 title={title}106 />107 );108 const actual = wrapper109 .find('.o-layout__item')110 .first()111 .find('.qa-heading2')112 .text();113 const expected = careProducts[0].title;114 expect(actual).to.equal(expected);115 });116 it("renders a product's price", () => {117 const reason = 'Foo bar baz';118 const handleClick = () => {};119 const isInViewport = false;120 const stopWatcher = () => {};121 const title = 'Foo bar';122 const wrapper = shallow(123 <ConsultationCareAndConcealerRecommendation124 handleClick={handleClick}125 isInViewport={isInViewport}126 reason={reason}127 products={careProducts}128 stopWatcher={stopWatcher}129 title={title}130 />131 );132 const actual = wrapper133 .find('.o-layout__item')134 .first()135 .find('.qa-price')136 .text();137 const expected = '£5';138 expect(actual).to.equal(expected);139 });140 it("renders a product's Add to Cart button with the product's variant id", () => {141 const reason = 'Foo bar baz';142 const handleClick = () => {};143 const isInViewport = false;144 const stopWatcher = () => {};145 const title = 'Foo bar';146 const wrapper = shallow(147 <ConsultationCareAndConcealerRecommendation148 handleClick={handleClick}149 isInViewport={isInViewport}150 reason={reason}151 products={careProducts}152 stopWatcher={stopWatcher}153 title={title}154 />155 );156 const actual = wrapper157 .find('.o-layout__item')158 .first()159 .find('AddToCartButton')160 .prop('variantId');161 const expected = careProducts[0].variantId;162 expect(actual).to.equal(expected);163 });164 it('renders no image for the product if it is not in the viewport', () => {165 const reason = 'Foo bar baz';166 const handleClick = () => {};167 const isInViewport = false;168 const stopWatcher = () => {};169 const title = 'Foo bar';170 const wrapper = shallow(171 <ConsultationCareAndConcealerRecommendation172 handleClick={handleClick}173 isInViewport={isInViewport}174 reason={reason}175 products={careProducts}176 stopWatcher={stopWatcher}177 title={title}178 />179 );180 const actual = wrapper181 .find('.o-layout__item')182 .first()183 .find('.qa-image')184 .prop('style').backgroundImage;185 const expected = null;186 expect(actual).to.equal(expected);187 });188 it('renders the box image for the product if it is in the viewport', () => {189 const reason = 'Foo bar baz';190 const handleClick = () => {};191 const isInViewport = true;192 const stopWatcher = () => {};193 const title = 'Foo bar';194 const wrapper = shallow(195 <ConsultationCareAndConcealerRecommendation196 handleClick={handleClick}197 isInViewport={isInViewport}198 reason={reason}199 products={careProducts}200 stopWatcher={stopWatcher}201 title={title}202 />203 );204 const actual = wrapper205 .find('.o-layout__item')206 .first()207 .find('.qa-image')208 .prop('style').backgroundImage;209 const expected = `url(${careProducts[0].image})`;210 expect(actual).to.equal(expected);211 });212 it('renders the details URL for the product', () => {213 const reason = 'Foo bar baz';214 const handleClick = () => {};215 const isInViewport = false;216 const stopWatcher = () => {};217 const title = 'Foo bar';218 const wrapper = shallow(219 <ConsultationCareAndConcealerRecommendation220 handleClick={handleClick}221 isInViewport={isInViewport}222 reason={reason}223 products={careProducts}224 stopWatcher={stopWatcher}225 title={title}226 />227 );228 const actual = wrapper229 .find('.o-layout__item')230 .first()231 .find('.qa-url')232 .prop('href');233 const expected = `/products/${careProducts[0].key}`;234 expect(actual).to.equal(expected);235 });...
is-in-viewport.js
Source: is-in-viewport.js
...12// expose isInViewport as a custom pseudo-selector13$.extend($.expr[':'], {14 // if $.expr.createPseudo is available, use it15 'in-viewport': $.expr.createPseudo16 ? $.expr.createPseudo(function (argsString) { return function (currElement) { return isInViewport(currElement, getSelectorArgs(argsString)); }; })17 : function (currObj, index, meta) { return isInViewport(currObj, getSelectorArgs(meta[3])); }18});19// expose isInViewport as a function too20// this lets folks pass around actual objects as options (like custom viewport)21// and doesn't tie 'em down to strings. It also prevents isInViewport from22// having to look up and wrap the dom element corresponding to the viewport selector23$.fn.isInViewport = function(options) {24 return this.filter(function (i, el) { return isInViewport(el, options); })25};26$.fn.run = run;27// lets you chain any arbitrary function or an array of functions and returns a jquery object28function run(args) {29 var this$1 = this;30 if (arguments.length === 1 && typeof args === 'function') {31 args = [args];32 }33 if (!(args instanceof Array)) {34 throw new SyntaxError('isInViewport: Argument(s) passed to .do/.run should be a function or an array of functions')35 }36 args.forEach(function (arg) {37 if (typeof arg !== 'function') {38 console.warn('isInViewport: Argument(s) passed to .do/.run should be a function or an array of functions');39 console.warn('isInViewport: Ignoring non-function values in array and moving on');40 } else {41 [].slice.call(this$1).forEach(function (t) { return arg.call($(t)); });42 }43 });44 return this45}46// gets the width of the scrollbar47function getScrollbarWidth(viewport) {48 // append a div that has 100% width to get true width of viewport49 var el = $('<div></div>').css({50 width: '100%'51 });52 viewport.append(el);53 // subtract true width from the viewport width which is inclusive54 // of scrollbar by default55 var scrollBarWidth = viewport.width() - el.width();56 // remove our element from DOM57 el.remove();58 return scrollBarWidth59}60// Returns true if DOM element `element` is in viewport61function isInViewport(element, options) {62 var ref = element.getBoundingClientRect();63 var top = ref.top;64 var bottom = ref.bottom;65 var left = ref.left;66 var right = ref.right;67 var settings = $.extend({68 tolerance: 0,69 viewport: window70 }, options);71 var isVisibleFlag = false;72 var $viewport = settings.viewport.jquery ? settings.viewport : $(settings.viewport);73 if (!$viewport.length) {74 console.warn('isInViewport: The viewport selector you have provided matches no element on page.');75 console.warn('isInViewport: Defaulting to viewport as window');...
scrollupbar.js
Source: scrollupbar.js
...12 }, options);13 function isFullyInViewport() {14 return $window.scrollTop() <= $bar.offset().top;15 }16 function isInViewport() {17 return $window.scrollTop() < $bar.offset().top + $bar.outerHeight();18 }19 var $window = $(window),20 $document = $(document),21 minY = $bar.css('position') == 'fixed' ? 0 : $bar.offset().top,22 lastY = $window.scrollTop(), // Use last Y to detect scroll direction.23 initialPosTop = $bar.position().top,24 iOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent),25 timeout;26 $.scrollupbar.isInViewport = isInViewport();27 $.scrollupbar.isFullyInViewport = isFullyInViewport();28 // iOS can't handle momentum scroll properly (See discussion on29 // http://stackoverflow.com/questions/2863547).30 if (!iOS) {31 $window.on('scroll.scrollupbar', function() {32 var y = $window.scrollTop(),33 barHeight = $bar.outerHeight();34 // Ignore elastic scrolling.35 if (y < 0 || y > ($document.height() - $window.height())) {36 return;37 }38 // Cancel the event fired by the previous scroll.39 if (timeout) {40 clearTimeout(timeout);41 }42 if (y < lastY) { // Scrolling up43 // If the bar is hidden, place it right above the top frame.44 if (!$.scrollupbar.isInViewport && lastY - barHeight >= minY) {45 $bar.css('top', lastY - barHeight);46 $.scrollupbar.isInViewport = true;47 options.enterViewport();48 }49 // Scrolls up bigger than the bar's height fixes the bar on top.50 if (isFullyInViewport()) {51 if (y >= minY) {52 $bar.css({53 'position': 'fixed',54 'top': 0, 55 });56 } else {57 $bar.css({58 'position': 'absolute',59 'top': initialPosTop60 });61 }62 if (!$.scrollupbar.isFullyInViewport) {63 $.scrollupbar.isFullyInViewport = true;64 options.fullyEnterViewport();65 }66 }67 // Fire an event to reveal the entire bar after 400ms if the scroll68 // wasn't big enough.69 timeout = setTimeout(function() {70 if (!isFullyInViewport()) {71 $bar.css({72 'position': 'fixed',73 'top': $bar.offset().top - y74 });75 $bar.animate({'top': 0}, 100, function() {76 $.scrollupbar.isFullyInViewport = true;77 options.fullyEnterViewport();78 });79 }80 }, 400);81 } else if (y > lastY) { // Scrolling down82 // Unfix the bar allowing it to scroll with the page.83 if ($.scrollupbar.isFullyInViewport) {84 $bar.css({85 'position': 'absolute',86 'top': lastY > minY ? lastY : initialPosTop87 });88 if (!isFullyInViewport()) {89 $.scrollupbar.isFullyInViewport = false;90 options.partiallyExitViewport();91 }92 }93 if ($.scrollupbar.isInViewport && !isInViewport()) {94 $.scrollupbar.isInViewport = false;95 options.exitViewport();96 }97 // Fire an event to hide the entire bar after 400ms if the scroll98 // wasn't big enough.99 timeout = setTimeout(function() {100 if (isInViewport() && y - barHeight >= minY) {101 $bar.animate({'top': y - barHeight}, 100, function() {102 $.scrollupbar.isInViewport = false;103 options.exitViewport();104 });105 }106 }, 400);107 }108 lastY = y;109 });110 } else { // Fallback simplified behaviour for iOS.111 $window.on('touchstart.scrollupbar', function () {112 lastY = $window.scrollTop();113 });114 $window.on('touchend.scrollupbar', function () {...
isInViewport.es6.js
Source: isInViewport.es6.js
...6// expose isInViewport as a custom pseudo-selector7$.extend($.expr.pseudos || $.expr[':'], {8 // if $.expr.createPseudo is available, use it9 'in-viewport': $.expr.createPseudo10 ? $.expr.createPseudo(function (argsString) { return function (currElement) { return isInViewport(currElement, getSelectorArgs(argsString)); }; })11 : function (currObj, index, meta) { return isInViewport(currObj, getSelectorArgs(meta[3])); }12})13// expose isInViewport as a function too14// this lets folks pass around actual objects as options (like custom viewport)15// and doesn't tie 'em down to strings. It also prevents isInViewport from16// having to look up and wrap the dom element corresponding to the viewport selector17$.fn.isInViewport = function(options) {18 return this.filter(function (i, el) { return isInViewport(el, options); })19}20$.fn.run = run21// lets you chain any arbitrary function or an array of functions and returns a jquery object22function run(args) {23 var this$1 = this;24 if (arguments.length === 1 && typeof args === 'function') {25 args = [args]26 }27 if (!(args instanceof Array)) {28 throw new SyntaxError('isInViewport: Argument(s) passed to .do/.run should be a function or an array of functions')29 }30 args.forEach(function (arg) {31 if (typeof arg !== 'function') {32 console.warn('isInViewport: Argument(s) passed to .do/.run should be a function or an array of functions')33 console.warn('isInViewport: Ignoring non-function values in array and moving on')34 } else {35 [].slice.call(this$1).forEach(function (t) { return arg.call($(t)); })36 }37 })38 return this39}40// gets the width of the scrollbar41function getScrollbarWidth(viewport) {42 // append a div that has 100% width to get true width of viewport43 var el = $('<div></div>').css({44 width: '100%'45 })46 viewport.append(el)47 // subtract true width from the viewport width which is inclusive48 // of scrollbar by default49 var scrollBarWidth = viewport.width() - el.width()50 // remove our element from DOM51 el.remove()52 return scrollBarWidth53}54// Returns true if DOM element `element` is in viewport55function isInViewport(element, options) {56 var ref = element.getBoundingClientRect();57 var top = ref.top;58 var bottom = ref.bottom;59 var left = ref.left;60 var right = ref.right;61 var settings = $.extend({62 tolerance: 0,63 viewport: window64 }, options)65 var isVisibleFlag = false66 var $viewport = settings.viewport.jquery ? settings.viewport : $(settings.viewport)67 if (!$viewport.length) {68 console.warn('isInViewport: The viewport selector you have provided matches no element on page.')69 console.warn('isInViewport: Defaulting to viewport as window')...
scroll-up-bar.js
Source: scroll-up-bar.js
...12 }, options);13 function isFullyInViewport() {14 return $window.scrollTop() <= $bar.offset().top;15 }16 function isInViewport() {17 return $window.scrollTop() < $bar.offset().top + $bar.outerHeight();18 }19 var $window = $(window),20 $document = $(document),21 minY = $bar.css('position') == 'fixed' ? 0 : $bar.offset().top,22 lastY = $window.scrollTop(), // Use last Y to detect scroll direction.23 initialPosTop = $bar.position().top,24 timeout;25 $.scrollupbar.isInViewport = isInViewport();26 $.scrollupbar.isFullyInViewport = isFullyInViewport();27 $window.on('scroll.scrollupbar', function() {28 var y = $window.scrollTop(),29 barHeight = $bar.outerHeight();30 // Ignore elastic scrolling.31 if (y < 0 || y > ($document.height() - $window.height())) {32 return;33 }34 // Cancel the event fired by the previous scroll.35 if (timeout) {36 clearTimeout(timeout);37 }38 if (y < lastY) { // Scrolling up39 // If the bar is hidden, place it right above the top frame.40 if (!$.scrollupbar.isInViewport && lastY - barHeight >= minY) {41 $bar.css('top', lastY - barHeight);42 $.scrollupbar.isInViewport = true;43 options.enterViewport();44 }45 // Scrolls up bigger than the bar's height fixes the bar on top.46 if (isFullyInViewport()) {47 if (y >= minY) {48 $bar.css({49 'position': 'fixed',50 'top': 051 });52 } else {53 $bar.css({54 'position': 'absolute',55 'top': initialPosTop56 });57 }58 if (!$.scrollupbar.isFullyInViewport) {59 $.scrollupbar.isFullyInViewport = true;60 options.fullyEnterViewport();61 }62 }63 // Fire an event to reveal the entire bar after 400ms if the scroll64 // wasn't big enough.65 timeout = setTimeout(function() {66 if (!$.scrollupbar.isFullyInViewport) {67 $bar.css({68 'position': 'fixed',69 'top': $bar.offset().top - y70 });71 $bar.animate({'top': 0}, 100, function() {72 $.scrollupbar.isFullyInViewport = true;73 options.fullyEnterViewport();74 });75 }76 }, 400);77 } else if (y > lastY) { // Scrolling down78 // Unfix the bar allowing it to scroll with the page.79 if ($.scrollupbar.isFullyInViewport) {80 $bar.css({81 // translate3d fixes iOS invisible element bug when changing82 // position values while scrolling.83 'transform': 'translate3d(0, 0, 0)',84 'position': 'absolute',85 'top': lastY > minY ? lastY : initialPosTop86 });87 if (!isFullyInViewport()) {88 $.scrollupbar.isFullyInViewport = false;89 options.partiallyExitViewport();90 }91 }92 if ($.scrollupbar.isInViewport && !isInViewport()) {93 $.scrollupbar.isInViewport = false;94 options.exitViewport();95 }96 // Fire an event to hide the entire bar after 400ms if the scroll97 // wasn't big enough.98 timeout = setTimeout(function() {99 if (isInViewport() && y - barHeight >= minY) {100 $bar.animate({'top': y - barHeight}, 100, function() {101 $.scrollupbar.isInViewport = false;102 options.exitViewport();103 });104 }105 }, 400);106 }107 lastY = y;108 });109 _destroyFn = function() {110 // Unbind all listeners added by scrollupbar plugin111 $window.off('.scrollupbar');112 // Restore original bar position.113 $bar.css({...
isInViewport.js
Source: isInViewport.js
2 * @author Mudit Ameta3 * @license https://github.com/zeusdeux/isInViewport/blob/master/license.md MIT4 */5(function($) {6 $.fn.isInViewport = function isInViewport(options) {7 8 var normalJsThisObj = this.get(0),9 boundingRect = normalJsThisObj.getBoundingClientRect(),10 top = boundingRect.top,11 bottom = boundingRect.bottom,12 endOfPage = ($(window).scrollTop() === ($(document).height() - $(window).height())) ? true : false,13 // hopefully this gets us a unique index in most cases14 index = "" + normalJsThisObj.offsetLeft + normalJsThisObj.offsetTop + boundingRect.height + boundingRect.width,15 settings = $.extend({16 "tolerance": 0,17 "debug": false18 }, options),19 isVisibleFlag = false;20 isInViewport.elementsAfterCurrent = isInViewport.elementsAfterCurrent || {};...
utils.js
Source: utils.js
1'use strict'2import * as Utils from '../utils'3describe('viewport utils', () => {4 it('calculates isInViewport correctly', () => {5 expect(Utils.isInViewport(0, 0, 0, 0, 0)).toEqual(true)6 // element above viewport7 expect(Utils.isInViewport(50, 100, 0, 20, 0)).toEqual(false)8 expect(Utils.isInViewport(50, 100, 0, 20, 0.5)).toEqual(true)9 // element inside viewport10 expect(Utils.isInViewport(50, 100, 40, 20, 0)).toEqual(true)11 expect(Utils.isInViewport(50, 100, 70, 20, 0)).toEqual(true)12 expect(Utils.isInViewport(50, 100, 90, 20, 0)).toEqual(true)13 // element below viewport14 expect(Utils.isInViewport(0, 100, 200, 20, 0.5)).toEqual(false)15 expect(Utils.isInViewport(0, 100, 200, 20, 1)).toEqual(true)16 })...
Using AI Code Generation
1describe('My First Test', () => {2 it('Does not do much!', () => {3 cy.contains('type').click()4 cy.url().should('include', '/commands/actions')5 cy.get('.action-email')6 .type('
Using AI Code Generation
1describe('My First Test', () => {2 it('Does not do much!', () => {3 cy.contains('type').click()4 cy.url().should('include', '/commands/actions')5 cy.get('.action-email').should('not.be.visible')6 cy.get('.action-email').should('be.visible')7 cy.get('.action-email').should('not.be.visible')8 cy.get('.action-email').should('be.visible')9 cy.get('.action-email').should('not.be.visible')10 cy.get('.action-email').should('be.visible')11 cy.get('.action-email').should('not.be.visible')12 cy.get('.action-email').should('be.visible')13 cy.get('.action-email').should('not.be.visible')14 cy.get('.action-email').should('be.visible')15 cy.get('.action-email').should('not.be.visible')16 cy.get('.action-email').should('be.visible')17 cy.get('.action-email').should('not.be.visible')18 cy.get('.action-email').should('be.visible')19 cy.get('.action-email').should('not.be.visible')20 cy.get('.action-email').should('be.visible')21 cy.get('.action-email').should('not.be.visible')22 cy.get('.action-email').should('be.visible')23 cy.get('.action-email').should('not.be.visible')24 cy.get('.action-email').should('be.visible')25 cy.get('.action-email').should('not.be.visible')26 cy.get('.action-email').should('be.visible')27 cy.get('.action-email').should('not.be.visible')28 cy.get('.action-email').should('be.visible')
Using AI Code Generation
1describe('My First Test', () => {2 it('Does not do much!', () => {3 cy.contains('type').click()4 cy.url().should('include', '/commands/actions')5 cy.get('.action-email').should('not.be.visible')6 cy.get('.action-email').should('be.visible')7 cy.get('.action-email').should('not.be.visible')8 cy.get('.action-email').should('be.visible')9 cy.get('.action-email').should('not.be.visible')10 cy.get('.action-email').should('be.visible')11 cy.get('.action-email').should('not.be.visible')12 cy.get('.action-email').should('be.visible')13 cy.get('.action-email').should('not.be.visible')14 cy.get('.action-email').should('be.visible')15 cy.get('.action-email').should('not.be.visible')16 cy.get('.action-email').should('be.visible')17 cy.get('.action-email').should('not.be.visible')18 cy.get('.action-email').should('be.visible')19 cy.get('.action-email').should('not.be.visible')20 cy.get('.action-email').should('be.visible')21 cy.get('.action-email').should('not.be.visible')22 cy.get('.action-email').should('be.visible')23 cy.get('.action-email').should('not.be.visible')24 cy.get('.action-email').should('be.visible')25 cy.get('.action-email').should('not.be.visible')26 cy.get('.action-email').should('be.visible')27 cy.get('.action-email').should('not.be.visible')28 cy.get('.action-email').should('be.visible')
Using AI Code Generation
1describe('My First Test', () => {2 it('Does not do much!', () => {3 cy.contains('type').click()4 cy.url().should('include', '/commands/actions')5 cy.get('.action-email')6 .type('
Using AI Code Generation
1descr/behtTesting isInVipwport', () => {2it ('should be in viewport', () => {queryg3 cy.visit#query-bts').should('b/.vxsibaemple.cypress.io/commands/querying')4 cy.get('.query-table').should('be.visible')5}) cy.get('tr').first().find('td').should('be.visible')6 cy.get('tr').first().find('td').shocld('be-commands.visible').and('be.inViewport')7})Ting isInViewport8 #query-bbe.visil')sI(
Using AI Code Generation
1describe('test', () => {cs-command2 it('testTes'ing isInVi,wpor() => {3 cy.get('input[name="q"]').type('Cypress')queryg4 cy.get('#query-buntnK"]').clibe.visiclk')()sI(5 .should('be.visible')6 .and(($a) => {7 exTesping isInViewport(isInViewport($a[0])).to.be.true8 })queryg9 })#query-bbe.visil')sI(10Cypress.Commands.add('isInViewport', (element) => {11ect()12 return (Tesing isInViwpor13 rect.bot#query-b be.visil')sI(14 (window.innerHeight || document.documentElement.clientHeight) &&15 rect.right <= (window.innerWidth || document.documentElement.clientWidth)16})cs-command17 module.exports = (on, config) => {queryg18 on('task',#query-bbe.visil')sI(19 isInViewport(element) {20 const rect = element[0].getBoundingClientRect()21 return (22 (window.innerHeight || document.documentquerymng.clientHeight) &&23 rect#query-bg ndow.innerWbe.visiild')thsI || docum(nt.documentElement.clientWidth)24 },25 })26}cs-command
Using AI Code Generation
1de to us#odt method ofbe.visi le').then(($el) => {2 cy.window().then((win) => {3 Cxpect(winypsIress($el[0]).to.be.true;4it(';test', () => {5 cy.get('.action-email').should('be.inViewport')6})7cy.get('#i').should('b.vil).hn($el8descexpert(winb('InVtewpores$ [0])).to.btu;9 });10});11('test',#=dvsible').the(($el) => {12 cy.window().then((win) => {13 expect(win.isIn($el[0]).to.be.true;14 ; cy.get('.action-email').should('be.inViewport')15 })16})17cy.get('#i').should('b.vil).hn($el18 expect(win.isInViewport($el[0])).to.be.true;describe('test', () => {19 });est', () => {20 cy.get('.action-email').should('be.inViewport')21cy.ge)('#i').shuld('be.viible')then(($el) => {22 wndw().then((wn) => {23 expet(wi.IV($el[0]))o.be.rue;24 });25});26})coe t u iInVewr eo f C27yge('/do).de to ('se.visVbli').rhen(e$elthod of Cypress28descrw(ndow().'hen(twin) => {29 =>ct(winisInViewot($l[0]))t.be.true;30 });31});32it('test#id).then(($el => {33 cwindowi'hthen((wtn) => {34 expec:/wineasImViewportl$el[0])prts.be.tr.e;35 });36});37 cy.ge.#lould('be.inViewport')).then(($el => {38 cywiow().then(win) => {39 expct(winsIt($el[0])).to.be.rue;40 };41 ;})42})43cyget('#d').shuld('be.visible').then(($el) => {44cy.wind().n((win) => {45 xpct(wi.IV($el[0]))..be.tre;46 });47});48y.get('#id').shul('bvible').t(($el49describe('test', () => {50 it('test', () => {51 cy.get('.action-email').should('be.inViewport')52 })53})54describe('test', () => {55 it('test', () => {56 cy.get('.action-email').should('be.inViewport')57 })58})59describe('test', () => {60 it('test', () => {61 cy.get('.action-email').should('be.inViewport')62 })63})64describe('test', () => {65 it('test', () => {66 cy.get('.action-email').should('be.inViewport')67 })68})69describe('test', () => {70 it('test', () => {71 cy.get('.action-email').should('be.inViewport')72 })73})74describe('test', () => {75 it('test', () =>
Using AI Code Generation
1describe('Test to verify if element is in viewport or not', () => {2 it('Test to verify if element is in viewport or not', () => {3 cy.get('.query-list').should('be.visible');4 cy.get('.query-list').should('be.visible').then(($el) => {5 if (Cypress.dom.isInViewport($el)) {6 cy.log('Element is in viewport');7 } else {8 cy.log('Element is not in viewport');9 }10 });11 });12});13describe('test', ( => {
Using AI Code Generation
1Tes to vrify if element i in viewpor or not {2 cy.get('.query-list').should('be.visible');3 cy.get('.query-list').should('be.visible').then(($el) => {4 if (Cypress.dom.isInViewport($el)) {5 cy.log('Element is in viewport');6 } else {7 cy.log('Element is not in viewport');8 }9 });10 });11});
cypress wait for redirection after login
Cypress sees undefined when reffering to an aliased text value
Cypress: Stub response for same route with three different responses
Missing credentials in config, if using AWS_CONFIG_FILE, set AWS_SDK_LOAD_CONFIG=1 (credentials file is present)
In Cypress how to select input element based on name?
Validate CSS 'backgroud-image' URL using Cypress
How can we run offline tests using cypress in a PWA application?
Skipping a test in Cypress conditionally
How to add types to Cypress.env?
How can I test automatically Service Workers in offline mode? Trying with Cypress
Cypress provides retry abilities on assertion. You can resolve the waiting issue for the redirection URL with the below change
cy.url().should('contain', '/redirection-url')
OR
cy.url().should('eq', 'mysite.com/redirection-url')
Here should
assertion will wait till 4 seconds by default and retries cy.url()
You can change the default timeout by updating parameter in cypress.json
file
{
"defaultCommandTimeout": 30000
}
Hope this will solve your issue.
Check out the latest blogs from LambdaTest on this topic:
Every company wants their release cycle to be driven in the fast lane. Agile and automation testing have been the primary tools in the arsenal of any web development team. Incorporating both in SDLC(Software Development Life Cycle), has empowered web testers and developers to collaborate better and deliver faster. It is only natural to assume that these methodologies have become lifelines for web professionals, allowing them to cope up with the ever-changing customer demands.
Innovation distinguishes between a leader and a follower.
If you’re reading this, it’s either because you’re curious about the factors that go into Laravel testing and how to implement them in your application or because you just want to improve your knowledge of Laravel testing. Whatever your goals may be, you will have something to take away after reading this article.
Mobile devices and mobile applications – both are booming in the world today. The idea of having the power of a computer in your pocket is revolutionary. As per Statista, mobile accounts for more than half of the web traffic worldwide. Mobile devices (excluding tablets) contributed to 54.4 percent of global website traffic in the fourth quarter of 2021, increasing consistently over the past couple of years.
Selenium has always been the most preferred test automation framework for testing web applications. This open-source framework supports popular programming languages (e.g. Java, JavaScript, Python, C#, etc.), browsers, and operating systems. It can also be integrated with other test automation frameworks like JUnit, TestNG, PyTest, PyUnit, amongst others. As per the State of open source testing survey, Selenium is still the king for web automation testing, with 81% of organizations preferring it over other frameworks.
Cypress is a renowned Javascript-based open-source, easy-to-use end-to-end testing framework primarily used for testing web applications. Cypress is a relatively new player in the automation testing space and has been gaining much traction lately, as evidenced by the number of Forks (2.7K) and Stars (42.1K) for the project. LambdaTest’s Cypress Tutorial covers step-by-step guides that will help you learn from the basics till you run automation tests on LambdaTest.
You can elevate your expertise with end-to-end testing using the Cypress automation framework and stay one step ahead in your career by earning a Cypress certification. Check out our Cypress 101 Certification.
Watch this 3 hours of complete tutorial to learn the basics of Cypress and various Cypress commands with the Cypress testing at LambdaTest.
Get 100 minutes of automation test minutes FREE!!