Best JavaScript code snippet using storybook-root
DateTimeShortcuts.js
Source:DateTimeShortcuts.js
1// Inserts shortcut buttons after all of the following:2// <input type="text" class="vDateField">3// <input type="text" class="vTimeField">4var DateTimeShortcuts = {5 calendars: [],6 calendarInputs: [],7 clockInputs: [],8 dismissClockFunc: [],9 dismissCalendarFunc: [],10 calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled11 calendarDivName2: 'calendarin', // name of <div> that contains calendar12 calendarLinkName: 'calendarlink',// name of the link that is used to toggle13 clockDivName: 'clockbox', // name of clock <div> that gets toggled14 clockLinkName: 'clocklink', // name of the link that is used to toggle15 shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts16 timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch17 timezoneOffset: 0,18 admin_media_prefix: '',19 init: function() {20 // Get admin_media_prefix by grabbing it off the window object. It's21 // set in the admin/base.html template, so if it's not there, someone's22 // overridden the template. In that case, we'll set a clearly-invalid23 // value in the hopes that someone will examine HTTP requests and see it.24 if (window.__admin_media_prefix__ != undefined) {25 DateTimeShortcuts.admin_media_prefix = window.__admin_media_prefix__;26 } else {27 DateTimeShortcuts.admin_media_prefix = '/missing-admin-media-prefix/';28 }29 if (window.__admin_utc_offset__ != undefined) {30 var serverOffset = window.__admin_utc_offset__;31 var localOffset = new Date().getTimezoneOffset() * -60;32 DateTimeShortcuts.timezoneOffset = localOffset - serverOffset;33 }34 var inputs = document.getElementsByTagName('input');35 for (i=0; i<inputs.length; i++) {36 var inp = inputs[i];37 if (inp.getAttribute('type') == 'text' && inp.className.match(/vTimeField/)) {38 DateTimeShortcuts.addClock(inp);39 DateTimeShortcuts.addTimezoneWarning(inp);40 }41 else if (inp.getAttribute('type') == 'text' && inp.className.match(/vDateField/)) {42 DateTimeShortcuts.addCalendar(inp);43 DateTimeShortcuts.addTimezoneWarning(inp);44 }45 }46 },47 // Return the current time while accounting for the server timezone.48 now: function() {49 if (window.__admin_utc_offset__ != undefined) {50 var serverOffset = window.__admin_utc_offset__;51 var localNow = new Date();52 var localOffset = localNow.getTimezoneOffset() * -60;53 localNow.setTime(localNow.getTime() + 1000 * (serverOffset - localOffset));54 return localNow;55 } else {56 return new Date();57 }58 },59 // Add a warning when the time zone in the browser and backend do not match.60 addTimezoneWarning: function(inp) {61 var $ = django.jQuery;62 var warningClass = DateTimeShortcuts.timezoneWarningClass;63 var timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600;64 // Only warn if there is a time zone mismatch.65 if (!timezoneOffset)66 return;67 // Check if warning is already there.68 if ($(inp).siblings('.' + warningClass).length)69 return;70 var message;71 if (timezoneOffset > 0) {72 message = ngettext(73 'Note: You are %s hour ahead of server time.',74 'Note: You are %s hours ahead of server time.',75 timezoneOffset76 );77 }78 else {79 timezoneOffset *= -180 message = ngettext(81 'Note: You are %s hour behind server time.',82 'Note: You are %s hours behind server time.',83 timezoneOffset84 );85 }86 message = interpolate(message, [timezoneOffset]);87 var $warning = $('<span>');88 $warning.attr('class', warningClass);89 $warning.text(message);90 $(inp).parent()91 .append($('<br>'))92 .append($warning)93 },94 // Add clock widget to a given field95 addClock: function(inp) {96 var num = DateTimeShortcuts.clockInputs.length;97 DateTimeShortcuts.clockInputs[num] = inp;98 DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; };99 // Shortcut links (clock icon and "Now" link)100 var shortcuts_span = document.createElement('span');101 shortcuts_span.className = DateTimeShortcuts.shortCutsClass;102 inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);103 var now_link = document.createElement('a');104 now_link.setAttribute('href', "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", -1);");105 now_link.appendChild(document.createTextNode(gettext('Now')));106 var clock_link = document.createElement('a');107 clock_link.setAttribute('href', 'javascript:DateTimeShortcuts.openClock(' + num + ');');108 clock_link.id = DateTimeShortcuts.clockLinkName + num;109 quickElement('img', clock_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/icon_clock.gif', 'alt', gettext('Clock'));110 shortcuts_span.appendChild(document.createTextNode('\240'));111 shortcuts_span.appendChild(now_link);112 shortcuts_span.appendChild(document.createTextNode('\240|\240'));113 shortcuts_span.appendChild(clock_link);114 // Create clock link div115 //116 // Markup looks like:117 // <div id="clockbox1" class="clockbox module">118 // <h2>Choose a time</h2>119 // <ul class="timelist">120 // <li><a href="#">Now</a></li>121 // <li><a href="#">Midnight</a></li>122 // <li><a href="#">6 a.m.</a></li>123 // <li><a href="#">Noon</a></li>124 // </ul>125 // <p class="calendar-cancel"><a href="#">Cancel</a></p>126 // </div>127 var clock_box = document.createElement('div');128 clock_box.style.display = 'none';129 clock_box.style.position = 'absolute';130 clock_box.className = 'clockbox module';131 clock_box.setAttribute('id', DateTimeShortcuts.clockDivName + num);132 document.body.appendChild(clock_box);133 addEvent(clock_box, 'click', cancelEventPropagation);134 quickElement('h2', clock_box, gettext('Choose a time'));135 var time_list = quickElement('ul', clock_box);136 time_list.className = 'timelist';137 quickElement("a", quickElement("li", time_list), gettext("Now"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", -1);");138 quickElement("a", quickElement("li", time_list), gettext("Midnight"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 0);");139 quickElement("a", quickElement("li", time_list), gettext("6 a.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 6);");140 quickElement("a", quickElement("li", time_list), gettext("Noon"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", 12);");141 var cancel_p = quickElement('p', clock_box);142 cancel_p.className = 'calendar-cancel';143 quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissClock(' + num + ');');144 django.jQuery(document).bind('keyup', function(event) {145 if (event.which == 27) {146 // ESC key closes popup147 DateTimeShortcuts.dismissClock(num);148 event.preventDefault();149 }150 });151 },152 openClock: function(num) {153 var clock_box = document.getElementById(DateTimeShortcuts.clockDivName+num)154 var clock_link = document.getElementById(DateTimeShortcuts.clockLinkName+num)155 // Recalculate the clockbox position156 // is it left-to-right or right-to-left layout ?157 if (getStyle(document.body,'direction')!='rtl') {158 clock_box.style.left = findPosX(clock_link) + 17 + 'px';159 }160 else {161 // since style's width is in em, it'd be tough to calculate162 // px value of it. let's use an estimated px for now163 // TODO: IE returns wrong value for findPosX when in rtl mode164 // (it returns as it was left aligned), needs to be fixed.165 clock_box.style.left = findPosX(clock_link) - 110 + 'px';166 }167 clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px';168 // Show the clock box169 clock_box.style.display = 'block';170 addEvent(document, 'click', DateTimeShortcuts.dismissClockFunc[num]);171 },172 dismissClock: function(num) {173 document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none';174 removeEvent(document, 'click', DateTimeShortcuts.dismissClockFunc[num]);175 },176 handleClockQuicklink: function(num, val) {177 var d;178 if (val == -1) {179 d = DateTimeShortcuts.now();180 }181 else {182 d = new Date(1970, 1, 1, val, 0, 0, 0)183 }184 DateTimeShortcuts.clockInputs[num].value = d.strftime(get_format('TIME_INPUT_FORMATS')[0]);185 DateTimeShortcuts.clockInputs[num].focus();186 DateTimeShortcuts.dismissClock(num);187 },188 // Add calendar widget to a given field.189 addCalendar: function(inp) {190 var num = DateTimeShortcuts.calendars.length;191 DateTimeShortcuts.calendarInputs[num] = inp;192 DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; };193 // Shortcut links (calendar icon and "Today" link)194 var shortcuts_span = document.createElement('span');195 shortcuts_span.className = DateTimeShortcuts.shortCutsClass;196 inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);197 var today_link = document.createElement('a');198 today_link.setAttribute('href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');199 today_link.appendChild(document.createTextNode(gettext('Today')));200 var cal_link = document.createElement('a');201 cal_link.setAttribute('href', 'javascript:DateTimeShortcuts.openCalendar(' + num + ');');202 cal_link.id = DateTimeShortcuts.calendarLinkName + num;203 quickElement('img', cal_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/icon_calendar.gif', 'alt', gettext('Calendar'));204 shortcuts_span.appendChild(document.createTextNode('\240'));205 shortcuts_span.appendChild(today_link);206 shortcuts_span.appendChild(document.createTextNode('\240|\240'));207 shortcuts_span.appendChild(cal_link);208 // Create calendarbox div.209 //210 // Markup looks like:211 //212 // <div id="calendarbox3" class="calendarbox module">213 // <h2>214 // <a href="#" class="link-previous">‹</a>215 // <a href="#" class="link-next">›</a> February 2003216 // </h2>217 // <div class="calendar" id="calendarin3">218 // <!-- (cal) -->219 // </div>220 // <div class="calendar-shortcuts">221 // <a href="#">Yesterday</a> | <a href="#">Today</a> | <a href="#">Tomorrow</a>222 // </div>223 // <p class="calendar-cancel"><a href="#">Cancel</a></p>224 // </div>225 var cal_box = document.createElement('div');226 cal_box.style.display = 'none';227 cal_box.style.position = 'absolute';228 cal_box.className = 'calendarbox module';229 cal_box.setAttribute('id', DateTimeShortcuts.calendarDivName1 + num);230 document.body.appendChild(cal_box);231 addEvent(cal_box, 'click', cancelEventPropagation);232 // next-prev links233 var cal_nav = quickElement('div', cal_box);234 var cal_nav_prev = quickElement('a', cal_nav, '<', 'href', 'javascript:DateTimeShortcuts.drawPrev('+num+');');235 cal_nav_prev.className = 'calendarnav-previous';236 var cal_nav_next = quickElement('a', cal_nav, '>', 'href', 'javascript:DateTimeShortcuts.drawNext('+num+');');237 cal_nav_next.className = 'calendarnav-next';238 // main box239 var cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num);240 cal_main.className = 'calendar';241 DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num));242 DateTimeShortcuts.calendars[num].drawCurrent();243 // calendar shortcuts244 var shortcuts = quickElement('div', cal_box);245 shortcuts.className = 'calendar-shortcuts';246 quickElement('a', shortcuts, gettext('Yesterday'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', -1);');247 shortcuts.appendChild(document.createTextNode('\240|\240'));248 quickElement('a', shortcuts, gettext('Today'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');249 shortcuts.appendChild(document.createTextNode('\240|\240'));250 quickElement('a', shortcuts, gettext('Tomorrow'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', +1);');251 // cancel bar252 var cancel_p = quickElement('p', cal_box);253 cancel_p.className = 'calendar-cancel';254 quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissCalendar(' + num + ');');255 django.jQuery(document).bind('keyup', function(event) {256 if (event.which == 27) {257 // ESC key closes popup258 DateTimeShortcuts.dismissCalendar(num);259 event.preventDefault();260 }261 });262 },263 openCalendar: function(num) {264 var cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1+num)265 var cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName+num)266 var inp = DateTimeShortcuts.calendarInputs[num];267 // Determine if the current value in the input has a valid date.268 // If so, draw the calendar with that date's year and month.269 if (inp.value) {270 var format = get_format('DATE_INPUT_FORMATS')[0];271 var selected = inp.value.strptime(format);272 var year = selected.getFullYear();273 var month = selected.getMonth() + 1;274 var re = /\d{4}/275 if (re.test(year.toString()) && month >= 1 && month <= 12) {276 DateTimeShortcuts.calendars[num].drawDate(month, year, selected);277 }278 }279 // Recalculate the clockbox position280 // is it left-to-right or right-to-left layout ?281 if (getStyle(document.body,'direction')!='rtl') {282 cal_box.style.left = findPosX(cal_link) + 17 + 'px';283 }284 else {285 // since style's width is in em, it'd be tough to calculate286 // px value of it. let's use an estimated px for now287 // TODO: IE returns wrong value for findPosX when in rtl mode288 // (it returns as it was left aligned), needs to be fixed.289 cal_box.style.left = findPosX(cal_link) - 180 + 'px';290 }291 cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px';292 cal_box.style.display = 'block';293 addEvent(document, 'click', DateTimeShortcuts.dismissCalendarFunc[num]);294 },295 dismissCalendar: function(num) {296 document.getElementById(DateTimeShortcuts.calendarDivName1+num).style.display = 'none';297 removeEvent(document, 'click', DateTimeShortcuts.dismissCalendarFunc[num]);298 },299 drawPrev: function(num) {300 DateTimeShortcuts.calendars[num].drawPreviousMonth();301 },302 drawNext: function(num) {303 DateTimeShortcuts.calendars[num].drawNextMonth();304 },305 handleCalendarCallback: function(num) {306 var format = get_format('DATE_INPUT_FORMATS')[0];307 // the format needs to be escaped a little308 format = format.replace('\\', '\\\\');309 format = format.replace('\r', '\\r');310 format = format.replace('\n', '\\n');311 format = format.replace('\t', '\\t');312 format = format.replace("'", "\\'");313 return ["function(y, m, d) { DateTimeShortcuts.calendarInputs[",314 num,315 "].value = new Date(y, m-1, d).strftime('",316 format,317 "');DateTimeShortcuts.calendarInputs[",318 num,319 "].focus();document.getElementById(DateTimeShortcuts.calendarDivName1+",320 num,321 ").style.display='none';}"].join('');322 },323 handleCalendarQuickLink: function(num, offset) {324 var d = DateTimeShortcuts.now();325 d.setDate(d.getDate() + offset)326 DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]);327 DateTimeShortcuts.calendarInputs[num].focus();328 DateTimeShortcuts.dismissCalendar(num);329 }330}...
Using AI Code Generation
1import { storiesOf } from 'storybook-root'2storiesOf('Button', module)3 .add('with text', () => <Button>Hello Button</Button>)4 .add('with some emoji', () => (5import { configure } from 'storybook-root'6const req = require.context('../src', true, /.stories.js$/)7function loadStories() {8 req.keys().forEach(filename => req(filename))9}10configure(loadStories, module)11import { configure } from 'storybook-root'12const req = require.context('../src', true, /.stories.js$/)13function loadStories() {14 req.keys().forEach(filename => req(filename))15}16configure(loadStories, module)17import { configure } from 'storybook-root'18const req = require.context('../src', true, /.stories.js$/)19function loadStories() {20 req.keys().forEach(filename => req(filename))21}22configure(loadStories, module)
Using AI Code Generation
1import { storiesOf, action } from '@kadira/storybook';2import { withKnobs, text, boolean, number } from '@kadira/storybook-addon-knobs';3import { withNotes } from '@kadira/storybook-addon-notes';4import { withInfo } from '@kadira/storybook-addon-info';5import { withReadme } from 'storybook-readme';6import { withOptions } from '@kadira/storybook-addon-options';7import { withBackgrounds } from '@kadira/storybook-addon-backgrounds';8import { withViewport } from '@kadira/storybook-addon-viewport';9import { withLinks } from '@kadira/storybook-addon-links';10import { withConsole } from '@kadira/storybook-addon-console';11import { withTests } from '@kadira/storybook-addon-specifications';12import initStoryshots from '@kadira/storybook-addon-storyshots';13import { configure, setAddon } from '@kadira/storybook';14import infoAddon from '@kadira/react-storybook-addon-info';15import { withInfo } from '@kadira/storybook-addon-info';16setAddon(infoAddon);17const req = require.context('../src', true, /\.stories\.js$/);18function loadStories() {19 req.keys().forEach((filename) => req(filename));20}21configure(loadStories, module);22import initStoryshots from '@kadira/storybook-addon-storyshots';23import { configure, setAddon } from '@kadira/storybook';24import infoAddon from '@kadira/react-storybook-addon-info';25import { withInfo } from '@kadira/storybook-addon-info';26setAddon(infoAddon);27const req = require.context('../src', true, /\.stories\.js$/);28function loadStories() {29 req.keys().forEach((filename) => req(filename));30}31configure(loadStories, module);32import initStoryshots from '@kadira/storybook-addon-storyshots';33import { configure, setAddon } from '@kadira/storybook';34import infoAddon from '@kadira/react-storybook-addon-info';35import { withInfo } from '@kadira/storybook-addon-info';36setAddon(infoAddon);37const req = require.context('../src', true, /\.stories\.js$/);38function loadStories() {39 req.keys().forEach((filename) => req(filename));40}41configure(loadStories, module);42import init
Using AI Code Generation
1const { shortcuts } = require('storybook-root');2module.exports = {3 webpackFinal: async (config, { configType }) => {4 config.resolve.alias = {5 ...shortcuts(),6 };7 return config;8 },9};10const { shortcuts } = require('storybook-root');11module.exports = {12 ...shortcuts(),13};14const { shortcuts } = require('storybook-root');15module.exports = {16 ...shortcuts(),17};
Using AI Code Generation
1import { shortcuts } from 'storybook-root'2shortcuts.add('a', () => console.log('a'))3shortcuts.add('b', () => console.log('b'))4shortcuts.add('c', () => console.log('c'))5shortcuts.add('d', () => console.log('d'), { preventDefault: true })6shortcuts.add('e', () => console.log('e'), { preventDefault: true })7shortcuts.add('f', () => console.log('f'), { preventDefault: true })8shortcuts.add('g', () => console.log('g'), { preventDefault: true, stopPropagation: true })9shortcuts.add('h', () => console.log('h'), { preventDefault: true, stopPropagation: true })10shortcuts.add('i', () => console.log('i'), { preventDefault: true, stopPropagation: true })11shortcuts.add('j', () => console.log('j'), { preventDefault: true, stopPropagation: true, target: document.getElementById('root') })12shortcuts.add('k', () => console.log('k'), { preventDefault: true, stopPropagation: true, target: document.getElementById('root') })13shortcuts.add('l', () => console.log('l'), { preventDefault: true, stopPropagation: true, target: document.getElementById('root') })14shortcuts.add('m', () => console.log('m'), { preventDefault: true, stopPropagation: true, target: document.getElementById('root'), event: 'keyup' })15shortcuts.add('n', () => console.log('n'), { preventDefault: true, stopPropagation: true, target: document.getElementById('root'), event: 'keyup' })16shortcuts.add('o', () => console.log('o'), { preventDefault: true, stopPropagation: true, target: document.getElementById('root'), event: 'keyup' })17shortcuts.add('p', () => console.log('p'), { preventDefault: true, stopPropagation: true, event: 'keyup' })18shortcuts.add('q', () => console.log('q'), { preventDefault: true, stopPropagation: true, event: 'keyup' })19shortcuts.add('r', () => console.log('r'), { preventDefault: true, stopPropagation: true, event: 'keyup' })20shortcuts.add('s', () => console.log('s'), { preventDefault: true, stopPropagation: true, target
Using AI Code Generation
1import { storiesOf } from "@storybook/react";2import { withInfo } from "@storybook/addon-info";3import { withKnobs, text, boolean, number } from "@storybook/addon-knobs/react";4import { withNotes } from "@storybook/addon-notes";5import { withReadme } from "storybook-readme";6import { withA11y } from "@storybook/addon-a11y";7import { withViewport } from "@storybook/addon-viewport";8import { withOptions } from "@storybook/addon-options";9import { withBackgrounds } from "@storybook/addon-backgrounds";10import { withConsole } from "@storybook/addon-console";11import { withTests } from "@storybook/addon-jest";12import { withLinks } from "@storybook/addon-links";13import { withPropsCombinations } from "react-storybook-addon-props-combinations";14import { withState } from "@dump247/storybook-state";15import { withActions } from "@storybook/addon-actions";16import { withContexts } from "@storybook/addon-contexts/react";17import { withCsf } from "@storybook/addon-csf";18import { withCssResources } from "@storybook/addon-cssresources";19import { withDocs } from "storybook-readme";20import { withGraphQL } from "@storybook/addon-graphql";21import { withHeadings } from "@storybook/addon-headings";22import { withI18n } from "storybook-addon-i18n";23import { withInfoOptions } from "./withInfoOptions";24import { withIntl } from "storybook-addon-intl";25import { withJest } from "storybook-addon-jest";26import { withKnobsOptions } from "./withKnobsOptions";27import { withLayout } from "storybook-addon-layout";28import { withLiveEditScope } from "storybook-addon-react-live-edit";29import { withMaterialUi } from "storybook-addon-material-ui";30import { withOptionsOptions } from "./withOptionsOptions";31import { withPerformance } from "storybook-addon-performance";32import { withPropsTable } from "storybook-addon-react-docgen";33import { withReactRouter } from "storybook-react-router";34import { withRedux } from "addon-redux";35import { withSmartKnobs } from "storybook-addon-smart-knobs";36import { withSource } from "@storybook/addon-storysource";37import { withStorysourceOptions } from "./withStorysourceOptions";38import { withTests
Using AI Code Generation
1import {storiesOf} from 'storybook-root';2import {withKnobs, text} from '@storybook/addon-knobs';3storiesOf('Test', module)4 .addDecorator(withKnobs)5 .add('Test', () => {6 const label = 'Name';7 const defaultValue = 'John Doe';8 const groupId = 'GROUP-ID1';9 const value = text(label, defaultValue, groupId);10 return <div>{value}</div>;11 });12import {configure} from '@storybook/react';13import {setOptions} from '@storybook/addon-options';14import {withKnobs} from '@storybook/addon-knobs';15setOptions({
Using AI Code Generation
1import { shortcuts } from 'storybook-root';2import { shortcuts } from 'storybook-root';3import { shortcuts } from 'storybook-root';4import { shortcuts } from 'storybook-root';5import { shortcuts } from 'storybook-root';6import { shortcuts } from 'storybook-root';7import { shortcuts } from 'storybook-root';8import { shortcuts } from 'storybook-root';9import { shortcuts } from 'storybook-root';10import { shortcuts } from 'storybook-root';11MIT © [sauravhiremath](
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!!