Best JavaScript code snippet using puppeteer
bot.test.js
Source:bot.test.js
1/* eslint-disable no-console */2const PhotofeelerBot = require('./bot');3const CONSTANTS = require('./constants');4describe('Photofeeler Bot', () => {5 describe('login()', () => {6 it('Should call the correct login implementation. (BY_COOKIES)', async (done) => {7 PhotofeelerBot.loginWithCookies = jest.fn(() => jest.fn(async () => Promise.resolve()));8 await PhotofeelerBot.login({9 loginMode: CONSTANTS.LOGIN_MODE.BY_COOKIES,10 cookies: { c: 1 },11 })('call 0');12 expect(PhotofeelerBot.loginWithCookies)13 .toHaveBeenCalledWith({ c: 1 });14 PhotofeelerBot.loginWithCookies.mockRestore();15 done();16 });17 it('Should call the correct login implementation. (BY_CREDENTIALS)', async (done) => {18 PhotofeelerBot.loginWithCredentials = jest.fn(async () => jest.fn(async () => Promise.resolve())); // eslint-disable-line19 const credentials = { email: 'johndoe@email.com', password: '123456' };20 await PhotofeelerBot.login({21 loginMode: CONSTANTS.LOGIN_MODE.BY_CREDENTIALS,22 credentials,23 })('page');24 expect(PhotofeelerBot.loginWithCredentials)25 .toHaveBeenCalledWith(credentials, 'page');26 done();27 });28 it('Should reject if no login mode was passed.', async (done) => {29 PhotofeelerBot.login({})().catch(() => {30 expect(true).toBeTruthy();31 done();32 });33 });34 });35 describe('doLogin()', () => {36 it('should click the login button, wait for the new page to load and return the page', async (done) => {37 const pageMock = {38 click: jest.fn(() => Promise.resolve()),39 waitForNavigation: jest.fn(() => Promise.resolve()),40 };41 const result = await PhotofeelerBot.doLogin(pageMock);42 expect(pageMock.click).toHaveBeenCalledWith('input[type="submit"]');43 expect(pageMock.waitForNavigation).toHaveBeenCalledWith({ waitUntil: 'networkidle2' });44 expect(result).toEqual(pageMock);45 done();46 });47 });48 describe('gotoPage()', () => {49 it('should return page if success.', async (done) => {50 const pageMock = {51 goto: jest.fn(() => Promise.resolve()),52 };53 const url = 'url';54 const result = await PhotofeelerBot.gotoPage(url)(pageMock);55 expect(result).toEqual(pageMock);56 expect(pageMock.goto).toHaveBeenCalledWith(url, { waitUntil: 'networkidle2' });57 done();58 });59 });60 describe('fillCredentials()', () => {61 it('should fill the credentials correctly and return the page if success.', async (done) => {62 const pageMock = {63 type: jest.fn(() => Promise.resolve()),64 };65 const credentials = { email: 'johndoe@email.com', password: '123456' };66 const result = await PhotofeelerBot.fillCredentials(credentials)(pageMock);67 expect(result).toEqual(pageMock);68 expect(pageMock.type).toHaveBeenCalledWith('input[type="email"]', credentials.email);69 expect(pageMock.type).toHaveBeenCalledWith('input[type="password"]', credentials.password);70 done();71 });72 });73 describe('setCookies()', () => {74 it('should set browser cookies', async (done) => {75 const pageMock = {76 setCookie: jest.fn(() => Promise.resolve()),77 };78 const cookies = [{ a: 'a' }, { b: 'b' }];79 await PhotofeelerBot.setCookies(cookies)(pageMock);80 expect(pageMock.setCookie).toHaveBeenCalledWith(...cookies);81 done();82 });83 });84 describe('submitRate()', () => {85 it('should call evaluate to click the button.', async (done) => {86 const pageMock = {87 evaluate: jest.fn(() => Promise.resolve()),88 };89 await PhotofeelerBot.submitRate(pageMock);90 expect(pageMock.evaluate).toHaveBeenCalled();91 done();92 });93 });94 describe('getRateButtons()', () => {95 it('should bring the rating buttons.', async (done) => {96 const pageMock = {97 $$: jest.fn(() => Promise.resolve([])),98 };99 const result = await PhotofeelerBot.getRateButtons(pageMock);100 expect(result).toEqual({101 smart: [],102 trustWorthy: [],103 attractive: [],104 });105 done();106 });107 });108 describe('getNewPage()', () => {109 it('should return a new page.', async (done) => {110 const pageMock = { type: () => {} };111 const browserMock = {112 newPage: jest.fn(() => Promise.resolve(pageMock)),113 };114 const result = await PhotofeelerBot.getNewPage(browserMock);115 expect(result).toEqual(pageMock);116 done();117 });118 });119 describe('closePageBrowser()', () => {120 it('should close the browser from the passed page.', async (done) => {121 const browserMock = {122 close: jest.fn(),123 };124 const pageMock = { browser: () => browserMock };125 await PhotofeelerBot.closePageBrowser(pageMock);126 expect(browserMock.close).toHaveBeenCalled();127 done();128 });129 });130 describe('getBrowser()', () => {131 it('should return a puppeteer browser', async (done) => {132 const browserMock = { close: () => {} };133 const puppeteerMock = { launch: jest.fn(() => Promise.resolve(browserMock)) };134 const result = await PhotofeelerBot.getBrowser(puppeteerMock, { headless: true });135 expect(result).toEqual(browserMock);136 done();137 });138 });139 describe('randomlyRate()', () => {140 it('should return the page if finished rating', async (done) => {141 const buttonsMock = [{142 isIntersectingViewport: () => false,143 }];144 PhotofeelerBot.getRateButtons = jest.fn(() => Promise.resolve({145 smart: buttonsMock,146 trustWorthy: buttonsMock,147 attractive: buttonsMock,148 }));149 const pageMock = {150 type: () => {},151 $eval: () => Promise.resolve(false),152 };153 const result = await PhotofeelerBot.randomlyRate(pageMock);154 expect(result).toEqual(pageMock);155 PhotofeelerBot.getRateButtons.mockRestore();156 done();157 });158 it('should return the page if reached karma', async (done) => {159 const buttonsMock = [{160 isIntersectingViewport: () => true,161 }];162 PhotofeelerBot.getRateButtons = jest.fn(() => Promise.resolve({163 smart: buttonsMock,164 trustWorthy: buttonsMock,165 attractive: buttonsMock,166 }));167 const pageMock = {168 type: () => {},169 $eval: () => Promise.resolve(true),170 };171 const result = await PhotofeelerBot.randomlyRate(pageMock);172 expect(result).toEqual(pageMock);173 PhotofeelerBot.getRateButtons.mockRestore();174 done();175 });176 it('should click the rate buttons', async (done) => {177 const buttonsMock = [{178 isIntersectingViewport: () => true,179 click: jest.fn(() => Promise.resolve()),180 }];181 PhotofeelerBot.getRateButtons = jest.fn(() => Promise.resolve({182 smart: buttonsMock,183 trustWorthy: buttonsMock,184 attractive: buttonsMock,185 }));186 PhotofeelerBot.submitRate = jest.fn(() => Promise.resolve());187 const pageMock = {188 type: () => {},189 $eval: () => Promise.resolve(false),190 };191 setTimeout(() => {192 buttonsMock[0].isIntersectingViewport = () => false;193 }, 2000);194 const result = await PhotofeelerBot.randomlyRate(pageMock);195 expect(buttonsMock[0].click).toHaveBeenCalledTimes(3);196 expect(PhotofeelerBot.submitRate).toHaveBeenCalledWith(pageMock);197 expect(result).toEqual(pageMock);198 PhotofeelerBot.getRateButtons.mockRestore();199 PhotofeelerBot.submitRate.mockRestore();200 done();201 });202 });203 describe('finish()', () => {204 it('should log a final message and exit process with zero-code', () => {205 console.log = jest.fn();206 process.exit = jest.fn();207 PhotofeelerBot.finish();208 expect(console.log).toHaveBeenCalledWith('All rates done! Cheers!');209 expect(process.exit).toHaveBeenCalledWith(0);210 console.log.mockRestore();211 process.exit.mockRestore();212 });213 describe('onError()', () => {214 it('should log an error message and exit with a non-zero status (1)', () => {215 console.error = jest.fn();216 process.exit = jest.fn();217 PhotofeelerBot.onError('Some error message.');218 expect(console.error).toHaveBeenCalledWith('Some error message.');219 expect(process.exit).toHaveBeenCalledWith(1);220 console.error.mockRestore();221 process.exit.mockRestore();222 });223 });224 });...
demo.spec.js
Source:demo.spec.js
...32 expect(await page.$$eval('.vjslider__slide', elements => elements.length)).toBe(7);33 });3435 test('sliding forward', async () => {36 expect(await slide1.isIntersectingViewport()).toBe(true);37 expect(await slide2.isIntersectingViewport()).toBe(false);38 expect(await slide3.isIntersectingViewport()).toBe(false);39 await Promise.all([40 page.click('[data-next]'),41 page.click('[data-next]'),42 page.click('[data-next]'),43 new Promise(resolve => setTimeout(resolve, 400))44 ]);45 expect(await slide1.isIntersectingViewport()).toBe(false);46 expect(await slide2.isIntersectingViewport()).toBe(true);47 expect(await slide3.isIntersectingViewport()).toBe(false);48 });4950 test('sliding forward again', async () => {51 await Promise.all([52 page.click('[data-next]'),53 new Promise(resolve => setTimeout(resolve, 400))54 ]);55 expect(await slide1.isIntersectingViewport()).toBe(false);56 expect(await slide2.isIntersectingViewport()).toBe(false);57 expect(await slide3.isIntersectingViewport()).toBe(true);58 });5960 test('sliding backward', async () => {61 await Promise.all([62 page.click('[data-prev]'),63 new Promise(resolve => setTimeout(resolve, 400))64 ]);65 expect(await slide1.isIntersectingViewport()).toBe(false);66 expect(await slide2.isIntersectingViewport()).toBe(true);67 expect(await slide3.isIntersectingViewport()).toBe(false);68 });6970 test('swiping left with to small movement', async () => {71 await page.mouse.move(300, 300);72 await page.mouse.down();73 await page.mouse.move(250, 300);74 await page.mouse.up();75 expect(await slide1.isIntersectingViewport()).toBe(false);76 expect(await slide2.isIntersectingViewport()).toBe(true);77 expect(await slide3.isIntersectingViewport()).toBe(false);78 });7980 test('swiping left', async () => {81 await page.mouse.move(300, 300);82 await page.mouse.down();83 await page.mouse.move(100, 300);84 await page.mouse.up();85 await new Promise(resolve => setTimeout(resolve, 400));86 expect(await slide1.isIntersectingViewport()).toBe(false);87 expect(await slide2.isIntersectingViewport()).toBe(false);88 expect(await slide3.isIntersectingViewport()).toBe(true);89 });9091 test('swiping right with to small movement', async () => {92 await page.mouse.move(300, 300);93 await page.mouse.down();94 await page.mouse.move(350, 300);95 await page.mouse.up();96 expect(await slide1.isIntersectingViewport()).toBe(false);97 expect(await slide2.isIntersectingViewport()).toBe(false);98 expect(await slide3.isIntersectingViewport()).toBe(true);99 });100101 test('swiping right', async () => {102 await page.mouse.move(300, 300);103 await page.mouse.down();104 await page.mouse.move(500, 300);105 await page.mouse.up();106 await new Promise(resolve => setTimeout(resolve, 400));107 expect(await slide1.isIntersectingViewport()).toBe(false);108 expect(await slide2.isIntersectingViewport()).toBe(true);109 expect(await slide3.isIntersectingViewport()).toBe(false);110 });111112 test('reloading', async () => {113 await Promise.all([114 page.click('[data-reload]'),115 new Promise(resolve => setTimeout(resolve, 400))116 ]);117 expect(await page.$$eval('.vjslider__slide', elements => elements.length)).toBe(10);118 expect(await slide1.isIntersectingViewport()).toBe(true);119 expect(await slide2.isIntersectingViewport()).toBe(true);120 });121122 test('destroying vjslider', async () => {123 await page.click('[data-destroy]');124 expect(await page.$('.vjslider__slide--no-animate')).toBeNull();125 expect(await page.$('.vjslider__slider[style*=""]')).toBeNull();126 expect(await page.$('.vjslider__slide[style*=""]')).toBeNull();127 });
...
targetMethods.js
Source:targetMethods.js
...48 isAvailable: false49 };50 }51 try {52 const isIntersectingViewport = await elementHandle.isIntersectingViewport(),53 handleOpacity = await page.evaluateHandle( ( el ) =>54 window.getComputedStyle( el, null ).getPropertyValue( "opacity" ), elementHandle ),55 handleVisibility = await page.evaluateHandle( ( el ) =>56 window.getComputedStyle( el, null ).getPropertyValue( "visibility" ), elementHandle ),57 handleDisplay = await page.evaluateHandle( ( el ) =>58 window.getComputedStyle( el, null ).getPropertyValue( "display" ), elementHandle ),59 opacity = parseFloat( await handleOpacity.jsonValue() ),60 visibility = await handleVisibility.jsonValue(),61 display = await handleDisplay.jsonValue();62 return {63 isAvailable: true,64 display,65 visibility,66 opacity,...
multiple-slides.spec.js
Source:multiple-slides.spec.js
...30 expect(slide4).not.toBeNull();31 });3233 test('sliding forward', async () => {34 expect(await slide1.isIntersectingViewport()).toBe(true);35 expect(await slide2.isIntersectingViewport()).toBe(true);36 expect(await slide3.isIntersectingViewport()).toBe(false);37 expect(await slide4.isIntersectingViewport()).toBe(false);38 await Promise.all([39 page.click('[data-next]'),40 new Promise(resolve => setTimeout(resolve, 400))41 ]);42 expect(await slide1.isIntersectingViewport()).toBe(false);43 expect(await slide2.isIntersectingViewport()).toBe(true);44 expect(await slide3.isIntersectingViewport()).toBe(true);45 expect(await slide4.isIntersectingViewport()).toBe(false);46 });4748 test('sliding backward', async () => {49 await Promise.all([50 page.click('[data-prev]'),51 new Promise(resolve => setTimeout(resolve, 400))52 ]);53 expect(await slide1.isIntersectingViewport()).toBe(true);54 expect(await slide2.isIntersectingViewport()).toBe(true);55 expect(await slide3.isIntersectingViewport()).toBe(false);56 expect(await slide4.isIntersectingViewport()).toBe(false);57 });5859 test('reloading', async () => {60 await Promise.all([61 page.click('[data-reload]'),62 new Promise(resolve => setTimeout(resolve, 400))63 ]);64 expect(await page.$$eval('.vjslider__slide', elements => elements.length)).toBe(23);65 });
...
goal-prompt.test.js
Source:goal-prompt.test.js
...22 await page.keyboard.press('Enter')23 expect(24 await $document25 .findByText('Learn just enough from Cypress docs so I can write my tests')26 .then(async $el => await $el.isIntersectingViewport())27 ).toBe(true)28 })29 // test('A goal is set and the user visits a page', async () => {30 // const goalText = 'Learn just enough from Cypress docs so I can write my tests'31 // await extension.setStorage({ goal: goalText })32 // await page.reload()33 // $document = await page.getDocument(page)34 // const $complete = await $document.findByRole('button', { name: /complete/i })35 // $complete.click()36 // expect(await $document.findByText(goalText)).toEqual(null)37 // expect(38 // await $document39 // .findByLabelText(/what outcome do you seek?/i)40 // .then(async $el => await $el.isIntersectingViewport())41 // ).toBe(true)42 // await extension.setStorage({ goal: goalText })43 // await page.reload()44 // const $interrupt = await $document.findByRole('button', { name: /interrupt/i })45 // $interrupt.click()46 // expect(await $document.findByText(goalText)).toEqual(null)47 // expect(48 // await $document49 // .findByLabelText(/what outcome do you seek?/i)50 // .then(async $el => await $el.isIntersectingViewport())51 // ).toBe(true)52 // })53 afterAll(async () => {54 // await browser.close()55 })...
frontpage.test.js
Source:frontpage.test.js
...25 // Look for a list item which has a class of 'blog-item'26 const selector = '//li[contains(@class, "blog-item")]';27 const tile = await page.waitForXPath(selector);28 // Sense check - make sure the thing is there but not visible (we have to use the viewport, not the css visibility)29 await expect(tile.isIntersectingViewport()).resolves.toBeFalsy();30 const scrollButton = await page.waitForXPath('//*[contains(@aria-label,"scroll")]');31 await expect(scrollButton.isIntersectingViewport()).resolves.toBeTruthy();32 // Click, which should scroll33 await scrollButton.evaluate(scrollButton => scrollButton.click());34 // Nasty hack; wait for some scrolling to happen35 await page.waitFor(1000);36 // Now the button should be out of view37 await expect(scrollButton.isIntersectingViewport()).resolves.toBeFalsy();38 // Now we we should be able to see the tile39 await expect(tile.isIntersectingViewport()).resolves.toBeTruthy();40 });41 });...
puppeteerHelper.js
Source:puppeteerHelper.js
...3class PuppeteerHelper extends Helper {4 async seeInViewport(locator) {5 const page = this.helpers.Puppeteer.page;6 const input = await page.$(locator);7 assert.equal(await input.isIntersectingViewport(input), true);8 }9 async dontSeeInViewport(locator) {10 const page = this.helpers.Puppeteer.page;11 const input = await page.$(locator);12 assert.equal(await input.isIntersectingViewport(input), false);13 }14 async seeDisabledAttribute(locator, type = "css") {15 const page = this.helpers.Puppeteer.page;16 let disabled;17 if (type === "css") {18 disabled = await page.$eval(locator, item => item.disabled);19 } else {20 const button = (await page.$x(locator))[0];21 disabled = await page.evaluate(item => item.disabled, button);22 }23 assert.equal(disabled, true);24 }25 async dontSeeDisabledAttribute(locator) {26 const page = this.helpers.Puppeteer.page;...
clicking.js
Source:clicking.js
...17const clickCheckboxByTest = async (page, text, cursor) => {18 const escapedText = escapeXpathString(text);19 const [clickMe] = await page.$x(`//*[contains(text(), ${escapedText})]/ancestor::tr/td[1]/input[@type="checkbox"]`);20 21 if(!(await clickMe.isIntersectingViewport())) {22 await page.evaluate((element) => { element.scrollIntoView({behavior: "smooth", block: "center", inline: "nearest"});}, clickMe);23 }24 25 26 const cursorStart = await cursor.moveTo({ x: 5, y: 5 });27 const resultclickMe = await cursor.click(clickMe);28 console.log(clickMe);29}30const clickById = async (page, id) => {31 const select = `[id="${id}"]`32 const clickMe = await page.$(select);33 console.log(id)34 35 if (!(await clickMe.isIntersectingViewport())) {36 await page.evaluate((element) => { element.scrollIntoView({behavior: "smooth", block: "center", inline: "nearest"}); }, clickMe);37 }38 const clickPoint = await clickMe.clickablePoint();39 const integerclickPoint = {40 x: parseInt(clickPoint.x, 10),41 y: parseInt(clickPoint.y, 10),42 };43 await clickMe.click();44 console.log({ resultclickMe });45};...
Using AI Code Generation
1const puppeteer = require('puppeteer');2(async () => {3 const browser = await puppeteer.launch();4 const page = await browser.newPage();5 await page.setViewport({ width: 800, height: 600 });6 await page.screenshot({ path: 'example.png' });7 const box = await page.evaluate(() => {8 const element = document.querySelector('h1');9 const { x, y, width, height } = element.getBoundingClientRect();10 return { x, y, width, height };11 });12 const isIntersecting = await page.evaluate(async (box) => {13 const element = document.querySelector('h1');14 return await new Promise(resolve => {15 const observer = new IntersectionObserver(([entry]) => {16 resolve(entry.isIntersecting);17 observer.disconnect();18 });19 observer.observe(element);20 });21 }, box);22 console.log(isIntersecting);23 await browser.close();24})();25const puppeteer = require('puppeteer');26(async () => {27 const browser = await puppeteer.launch();28 const page = await browser.newPage();29 await page.setViewport({ width: 800, height: 600 });30 await page.screenshot({ path: 'example.png' });31 const box = await page.evaluate(() => {32 const element = document.querySelector('h1');33 const { x, y, width, height } = element.getBoundingClientRect();34 return { x, y, width, height };35 });36 const isIntersecting = await page.evaluate(async (box) => {37 const element = document.querySelector('h1');38 return await new Promise(resolve => {39 const observer = new IntersectionObserver(([entry]) => {40 resolve(entry.isIntersecting);41 observer.disconnect();42 });43 observer.observe(element);44 });45 }, box);46 console.log(isIntersecting);47 await browser.close();48})();
Using AI Code Generation
1const puppeteer = require('puppeteer');2(async () => {3 const browser = await puppeteer.launch();4 const page = await browser.newPage();5 await page.setViewport({width: 1000, height: 500});6 const dimensions = await page.evaluate(() => {7 return {8 };9 });10 console.log('Dimensions:', dimensions);11 const isIntersectingViewport = await page.evaluate(() => {12 return document.querySelector('h1').isIntersectingViewport;13 });14 console.log('isIntersectingViewport:', isIntersectingViewport);15 await browser.close();16})();17Dimensions: { width: 1000, height: 500, deviceScaleFactor: 1 }
Using AI Code Generation
1const puppeteer = require('puppeteer');2(async () => {3 const browser = await puppeteer.launch();4 const page = await browser.newPage();5 const box = await page.evaluate(() => {6 const element = document.querySelector('h1');7 const { x, y, width, height } = element.getBoundingClientRect();8 return { x, y, width, height };9 });10 const isIntersecting = await page.evaluate((box) => {11 const element = document.querySelector('h1');12 return element.isIntersectingViewport(box);13 }, box);14 console.log(isIntersecting);15 await browser.close();16})();
Using AI Code Generation
1const puppeteer = require('puppeteer');2(async () => {3 const browser = await puppeteer.launch({headless: false});4 const page = await browser.newPage();5 const isIntersectingViewport = await page.evaluate(() => {6 const element = document.querySelector('div.logo');7 const boundingBox = element.getBoundingClientRect();8 boundingBox.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&9 boundingBox.right <= (window.innerWidth || document.documentElement.clientWidth);10 });11 console.log(isIntersectingViewport);12 await browser.close();13})();
Using AI Code Generation
1const puppeteer = require('puppeteer');2(async () => {3 const browser = await puppeteer.launch();4 const page = await browser.newPage();5 const element = await page.$('h1');6 const isIntersecting = await element.isIntersectingViewport();7 console.log(isIntersecting);8 await browser.close();9})();
Using AI Code Generation
1const puppeteer = require('puppeteer');2const fs = require('fs');3(async () => {4 const browser = await puppeteer.launch({headless: false});5 const page = await browser.newPage();6 const element = await page.$('input[name=q]');7 const result = await element.isIntersectingViewport();8 console.log(result);9 await browser.close();10})();
Using AI Code Generation
1const puppeteer = require('puppeteer');2(async () => {3 const browser = await puppeteer.launch();4 const page = await browser.newPage();5 await page.setViewport({width: 500, height: 500});6 const element = await page.$('#hplogo');7 const isIntersecting = await element.isIntersectingViewport();8 console.log(isIntersecting);9 await browser.close();10})();
Using AI Code Generation
1const puppeteer = require('puppeteer');2(async () => {3 const browser = await puppeteer.launch({headless: false});4 const page = await browser.newPage();5 await page.setViewport({width: 1000, height: 500});6 const element = await page.$('img');7 await element.hover();8 const isIntersecting = await page.evaluate(() => {9 const element = document.querySelector('img');10 const boundingBox = element.getBoundingClientRect();11 return (12 boundingBox.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&13 boundingBox.right <= (window.innerWidth || document.documentElement.clientWidth)14 );15 });16 console.log(isIntersecting);17 await browser.close();18})();
Using AI Code Generation
1const puppeteer = require('puppeteer');2async function getViewport(elementHandle) {3 const box = await elementHandle.boundingBox();4 const page = elementHandle.executionContext().frame();5 const { width, height } = await page.evaluate(() => {6 return {7 };8 });9 return {10 };11}12async function isIntersectingViewport(elementHandle) {13 const viewport = await getViewport(elementHandle);14 return (15 );16}17async function isIntersectingViewport(elementHandle) {18 const viewport = await getViewport(elementHandle);19 return (20 );21}22async function isIntersectingViewport(elementHandle) {23 const viewport = await getViewport(elementHandle);24 return (25 );26}27async function isIntersectingViewport(elementHandle) {28 const viewport = await getViewport(elementHandle);29 return (30 );31}32async function isIntersectingViewport(elementHandle) {33 const viewport = await getViewport(elementHandle);34 return (
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!