Best JavaScript code snippet using best
output.ts
Source:output.ts
1/*2 * Copyright (c) 2019, salesforce.com, inc.3 * All rights reserved.4 * SPDX-License-Identifier: MIT5 * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT6*/7import Table from 'cli-table3';8import chalk from 'chalk';9import Histogram from './histogram';10import {11 BenchmarkMetricNames,12 BenchmarkResultsSnapshot,13 EnvironmentConfig, StatsNode,14 BenchmarkComparison, ResultComparison,15 StatsResults16} from "@best/types";17import { OutputStream } from '@best/console-stream';18interface OutputConfig {19 outputHistograms?: boolean;20}21/*22 * The Output module can write a report or a comparison to a given stream based on a configuration.23 */24export default class Output {25 config: OutputConfig;26 stream: OutputStream;27 constructor(config: OutputConfig, stream: OutputStream) {28 this.config = config || {};29 this.stream = stream;30 }31 /*32 * Show a report for a given set of results.33 */34 report(results: BenchmarkResultsSnapshot[]) {35 results.forEach((result: BenchmarkResultsSnapshot) => {36 const { benchmarkInfo: { benchmarkName }, stats, projectConfig: { benchmarkOutput: benchmarkFolder } } = result;37 // Stats table.38 this.writeStats(benchmarkName, benchmarkFolder, stats!);39 // OS & Browser.40 this.writeEnvironment(result.environment);41 // Optional histogram for each line in the stats table.42 if (this.config.outputHistograms) {43 this.writeHistograms(stats!);44 }45 });46 }47 /*48 * Write a table of statistics for a single benchmark file.49 */50 writeStats(benchmarkName: string, resultsFolder: string, stats: StatsResults) {51 const table = new Table({52 head: ['Benchmark name', 'Metric (ms)', 'N', 'Mean ± StdDev', 'Median ± MAD'],53 style: { head: ['bgBlue', 'white'] },54 });55 this.generateRows(table, stats.results);56 this.stream.write(57 [58 chalk.bold.dim('\n Benchmark results for ') + chalk.bold.magentaBright(benchmarkName),59 chalk.italic(' ' + resultsFolder + '/'),60 table.toString() + '\n',61 ].join('\n'),62 );63 }64 /*65 * Write browser and CPU load information.66 */67 writeEnvironment({ browser, container }: EnvironmentConfig) {68 const cpuLoad = container.load.cpuLoad;69 const loadColor = cpuLoad < 10 ? 'green' : cpuLoad < 50 ? 'yellow' : 'red';70 this.stream.write(' ');71 this.stream.write(72 [73 'Browser version: ' + chalk.bold(browser.version),74 `Benchmark CPU load: ${chalk.bold[loadColor](cpuLoad.toFixed(3) + '%')}`,75 ].join('\n '),76 );77 this.stream.write('\n\n');78 }79 /*80 * Write a set of histograms for a tree of benchmarks.81 */82 writeHistograms(benchmarks: any, parentPath: string = '') {83 // const metricPattern = this.config.outputMetricPattern;84 // const histogramPattern = this.config.outputHistogramPattern;85 benchmarks.forEach((benchmark: any) => {86 const path = `${parentPath}${benchmark.name}`;87 const children = benchmark.benchmarks;88 if (children) {89 this.writeHistograms(children, `${path} > `);90 } else {91 // if (!histogramPattern.test(path)) {92 // return;93 // }94 Object.keys(benchmark).forEach(metric => {95 // if (!metricPattern.test(metric)) {96 // return;97 // }98 const stats = benchmark[metric];99 if (stats && stats.sampleSize) {100 const { samples } = stats;101 const histogram = new Histogram(samples, this.config);102 const plot = histogram.toString();103 this.stream.write(`\n${path} > ${metric}\n${plot}\n\n`);104 }105 });106 }107 });108 }109 /*110 * Recursively populate rows of statistics into a table for a tree of benchmarks.111 */112 generateRows(table: any, benchmarks: StatsNode[], level = 0) {113 // const metricPattern = //this.config.outputMetricPattern;114 benchmarks.forEach((benchmarkNode: StatsNode) => {115 const name = benchmarkNode.name;116 // Root benchmark117 if (benchmarkNode.type === "benchmark") {118 Object.keys(benchmarkNode.metrics).forEach((metric: string) => {119 const metricsStats = benchmarkNode.metrics[metric as BenchmarkMetricNames];120 const metricValues = metricsStats && metricsStats.stats;121 if (metricValues && metricValues.sampleSize) {122 const { sampleSize, mean, median, variance, medianAbsoluteDeviation } = metricValues;123 table.push([124 padding(level) + name,125 chalk.bold(metric),126 sampleSize,127 `${mean.toFixed(3)}` + chalk.gray(` ± ${(Math.sqrt(variance) / mean * 100).toFixed(1)}%`),128 `${median.toFixed(3)}` + chalk.gray(` ± ${(medianAbsoluteDeviation / median * 100).toFixed(1)}%`),129 ]);130 }131 });132 // Group133 } else if (benchmarkNode.type === "group") {134 const emptyFields = Array.apply(null, Array(4)).map(() => '-');135 table.push([padding(level) + name, ...emptyFields]);136 this.generateRows(table, benchmarkNode.nodes, level + 1);137 }138 });139 }140 /*141 * Show a comparison for a pair of commits.142 */143 compare(result: BenchmarkComparison) {144 const { baseCommit, targetCommit } = result;145 type GroupedTables = {146 [projectName: string]: Table[]147 }148 const tables: GroupedTables = result.comparisons.reduce((tables, node): GroupedTables => {149 if (node.type === "project" || node.type === "group") {150 const group = node.comparisons.map(child => {151 return this.generateComparisonTable(baseCommit, targetCommit, child);152 })153 return {154 ...tables,155 [node.name]: group156 }157 }158 return tables;159 }, <GroupedTables>{})160 const flattenedTables = Object.keys(tables).reduce((groups, projectName): string[] => {161 const stringifiedTables = tables[projectName].map(t => t.toString() + '\n');162 const colorProjectName = chalk.bold.dim(projectName);163 groups.push(`\nProject: ${colorProjectName}\n`);164 groups.push(...stringifiedTables);165 return groups;166 }, <string[]>[])167 this.stream.write(flattenedTables.join(''));168 }169 /*170 * Get a comparison table for two different commits.171 */172 generateComparisonTable(baseCommit: string, targetCommit: string, stats: ResultComparison) {173 const benchmark = stats.name.replace('.benchmark', '');174 const table = new Table({175 head: [`Benchmark: ${benchmark}`, `base (${baseCommit})`, `target (${targetCommit})`, 'trend'],176 style: {head: ['bgBlue', 'white']}177 });178 this.generateComparisonRows(table, stats);179 return table;180 }181 /*182 * Recursively populate rows into a table for a tree of comparisons.183 */184 generateComparisonRows(table: Table, stats: ResultComparison, groupName = '') {185 if (stats.type === "project" || stats.type === "group") {186 stats.comparisons.forEach(node => {187 if (node.type === "project" || node.type === "group") {188 const name = node.name;189 this.generateComparisonRows(table, node, name);190 } else if (node.type === "benchmark") {191 // // row with benchmark name192 const emptyFields = Array.apply(null, Array(3)).map(() => '-');193 table.push([chalk.dim(groupName + '/') + chalk.bold(node.name), ...emptyFields]);194 // row for each metric195 Object.keys(node.metrics).forEach((metric: string) => {196 const metrics = node.metrics[metric as BenchmarkMetricNames];197 if (metrics) {198 const baseStats = metrics.baseStats;199 const targetStats = metrics.targetStats;200 const samplesComparison = metrics.samplesComparison;201 table.push([202 padding(1) + metric,203 `${baseStats.median.toFixed(2)}` + chalk.gray(` (± ${baseStats.medianAbsoluteDeviation.toFixed(2)}ms)`),204 `${targetStats.median.toFixed(2)}` + chalk.gray(` (± ${targetStats.medianAbsoluteDeviation.toFixed(2)}ms)`),205 chalk.bold(samplesComparison === 0 ? 'SAME' : samplesComparison === 1 ? chalk.red('SLOWER') : chalk.green('FASTER'))206 ]);207 }208 });209 }210 })211 }212 }213}214function padding(n: number) {215 return n > 0216 ? Array.apply(null, Array((n - 1) * 3))217 .map(() => ' ')218 .join('') + 'ââ '219 : '';...
km.js
Source:km.js
1import { formatCentsToDollars, formatTime } from '../general/formatting'2import { constants } from '../raw/constants/km'3import { LINE_INCLUDES_TLD } from '../raw/constants/regex'4import { stripe } from '../raw/constants/stripe'5import { createHashId, optionizeObject } from '../react/helpers'6export const calculateTrialPrice = itemCount => {7 const result = {}8 let bumpUpFee = 09 if (itemCount < constants.VOLUME_DATA.MIN_ITEM_COUNT) {10 bumpUpFee =11 (constants.VOLUME_DATA.MIN_ITEM_COUNT - itemCount) *12 constants.VOLUME_DATA.KEYWORD_PRICE13 }14 const metricsCost = itemCount * constants.VOLUME_DATA.KEYWORD_PRICE15 const beforeFee = metricsCost + bumpUpFee16 const processingFee = beforeFee * stripe.VARIABLE_RATE + stripe.FIXED17 const total = beforeFee + processingFee18 result.unitPrice = formatCentsToDollars(constants.VOLUME_DATA.KEYWORD_PRICE)19 result.metricsCost = formatCentsToDollars(metricsCost)20 result.bumpUpFee = formatCentsToDollars(bumpUpFee)21 result.processingFee = formatCentsToDollars(processingFee)22 result.total = formatCentsToDollars(total)23 return result24}25export const takeLastTld = line =>26 line.replace(LINE_INCLUDES_TLD, '$2').trim().toLowerCase()27export const takeKewordsFromTld = line =>28 line.replace(LINE_INCLUDES_TLD, '$1').trim().toLowerCase()29export const parseBillableKeywords = fullList => {30 const reduced = fullList.reduce((acc, cur) => {31 const temp = acc32 let result = cur33 if (LINE_INCLUDES_TLD.test(cur)) {34 result = takeKewordsFromTld(cur)35 }36 temp.push(result)37 return temp38 }, [])39 return [...new Set(reduced)]40}41export const findMetricFromEntry = (keyword, field, volumes) => {42 let searchItem = keyword43 if (LINE_INCLUDES_TLD.test(keyword)) {44 searchItem = takeKewordsFromTld(keyword)45 }46 const metric = volumes.find(item => item.keyword === searchItem)47 let result = ''48 if (field === constants.VOLUME_DATA.CPC.VALUE) {49 result = parseFloat(metric[field].value)50 } else {51 result = metric[field]52 }53 return JSON.stringify(result)54}55export const buildCopyData = (inputRef, keywordsOnly) => {56 let builtData = null57 if (inputRef.length) {58 const tableRefs = inputRef59 const stringifiedTables = []60 for (let tableRef of tableRefs) {61 stringifiedTables.push(stringifyTable(tableRef, keywordsOnly))62 }63 const allTablesString = stringifiedTables.join('\n\n')64 builtData = allTablesString65 } else {66 const tableRef = inputRef67 const tableString = stringifyTable(tableRef, keywordsOnly)68 builtData = tableString69 }70 return builtData71}72const stringifyHeadCells = headCells => {73 let headings = ['Trial Id']74 for (let headCell of headCells) {75 headings.push(headCell.getAttribute('scope'))76 }77 return headings.join('\t')78}79const stringifyBodyRows = (bodyRows, keywordsOnly, trialId) => {80 const rowsArray = []81 for (let bodyRow of bodyRows) {82 let rowCells = bodyRow.children83 let rowArray = []84 let rowString = ''85 if (keywordsOnly) {86 rowArray.push(bodyRow.firstChild.nextSibling.innerHTML)87 } else {88 rowArray.push(trialId)89 for (let rowCell of rowCells) {90 if (91 rowCell.getAttribute('scope') ===92 constants.VOLUME_DATA.VOLUME.VALUE &&93 /\W/gi.test(rowCell.innerHTML)94 ) {95 rowArray.push('Available to Order')96 } else {97 rowArray.push(rowCell.innerHTML)98 }99 }100 }101 rowString = rowArray.join('\t')102 rowsArray.push(rowString)103 }104 return rowsArray.join('\n')105}106const stringifyTable = (tableRef, keywordsOnly) => {107 let result = ''108 const tableMeta = JSON.parse(tableRef.getAttribute('scope'))109 const { trialId, metricOptions } = tableMeta110 const hasMetrics = Object.values(metricOptions).length > 0111 if (!keywordsOnly) {112 if (hasMetrics) {113 result += `Target Country\t${metricOptions.country}\nCPC Currency\t${metricOptions.currency}\nData Source\t${metricOptions.dataSource}\n`114 }115 result += stringifyHeadCells(tableRef.firstChild.firstChild.children) + '\n'116 }117 result += stringifyBodyRows(118 tableRef.lastChild.children,119 keywordsOnly,120 trialId121 )122 return result123}124export const setInitialCountry = (previousSelection, ipCountry) => {125 if (previousSelection) return previousSelection126 if (/^gb$/i.test(ipCountry)) return 'uk'127 return ipCountry.toLowerCase()128}129const alphaCodeSetKeys = setData =>130 Object.keys(setData).reduce((acc, cur, ind) => {131 const temp = acc132 temp[String.fromCharCode(ind + 97)] = setData[cur].split('\n')133 return temp134 }, {})135const setList = setData => {136 const alphaCoded = alphaCodeSetKeys(setData)137 const list = []138 switch (Object.keys(alphaCoded).length) {139 case 5:140 for (let a of alphaCoded.a) {141 for (let b of alphaCoded.b) {142 for (let c of alphaCoded.c) {143 for (let d of alphaCoded.d) {144 for (let e of alphaCoded.e) {145 list.push(`${a} ${b} ${c} ${d} ${e}`)146 }147 }148 }149 }150 }151 break152 case 4:153 for (let a of alphaCoded.a) {154 for (let b of alphaCoded.b) {155 for (let c of alphaCoded.c) {156 for (let d of alphaCoded.d) {157 list.push(`${a} ${b} ${c} ${d}`)158 }159 }160 }161 }162 break163 case 3:164 for (let a of alphaCoded.a) {165 for (let b of alphaCoded.b) {166 for (let c of alphaCoded.c) {167 list.push(`${a} ${b} ${c}`)168 }169 }170 }171 break172 default:173 for (let a of alphaCoded.a) {174 for (let b of alphaCoded.b) {175 list.push(`${a} ${b}`)176 }177 }178 break179 }180 return list181}182export const processTrial = setData => {183 const result = {}184 const wholeList = setList(setData)185 try {186 result.heading = Object.keys(setData)187 .join(' x ')188 .replace(/setField/gi, '')189 result.list = wholeList190 result.billableKeywords = parseBillableKeywords(wholeList)191 } catch (error) {192 console.error('error', error)193 }194 return result195}196const removeAllButSpaces = line =>197 line198 .toLowerCase()199 .trim()200 .split(/\s+/gi)201 .map(word => word.replace(/[^a-z0-9]+/gi, ''))202 .join(' ')203export const prepSetValue = input => {204 const split = input205 .trim()206 .replace(/[\n\r]+/gi, '\n')207 .split(/\n/gi)208 const nonWordsRemoved = split.map(line => {209 let temp = removeAllButSpaces(line)210 if (LINE_INCLUDES_TLD.test(line)) {211 temp = takeLastTld(line)212 }213 return temp214 })215 const uniqueSet = new Set(nonWordsRemoved)216 return [...uniqueSet].join('\n').replace(/\n$/, '')217}218export const formatProductLine = (219 value,220 matchType,221 whiteSpaceCode,222 tldsHidden223) => {224 let result = ''225 if (whiteSpaceCode) {226 switch (whiteSpaceCode) {227 case constants.WHITESPACE_OPTIONS.NONE.VALUE:228 result = value.replace(/\s+/g, '')229 break230 case constants.WHITESPACE_OPTIONS.HYPHEN.VALUE:231 result = value.replace(/\s+/g, '-')232 break233 case constants.WHITESPACE_OPTIONS.UNDERSCORE.VALUE:234 result = value.replace(/\s+/g, '_')235 break236 default:237 result = value238 }239 if (result.match(/^(.*)[-_]+\.+(\w+)$/)) {240 result = result.replace(/[-_]+\.+/gi, '.')241 }242 } else {243 let matchTypeValue = value244 if (tldsHidden) {245 matchTypeValue = takeKewordsFromTld(matchTypeValue)246 }247 switch (matchType) {248 case constants.MATCHTYPES.BROAD_MODIFIER:249 result = matchTypeValue250 .replace(/(\w\B\w+)/g, '+$1')251 .replace(/\.\+/, '+.')252 break253 case constants.MATCHTYPES.PHRASE:254 result = `"${matchTypeValue}"`255 break256 case constants.MATCHTYPES.EXACT:257 result = `[${matchTypeValue}]`258 break259 default:260 result = matchTypeValue261 }262 }263 if (tldsHidden) return takeKewordsFromTld(result)264 return result265}266export const generateNotice = (267 message,268 kind = constants.NOTICE.KINDS.SIMPLE269) => {270 const result = {271 id: createHashId(),272 kind,273 bg: constants.NOTICE.BGS.PASS,274 heading: 'Success',275 message,276 choice: null,277 moment: Date.now()278 }279 if (kind !== constants.NOTICE.KINDS.SIMPLE) {280 result.bg = constants.NOTICE.BGS.WARN281 result.heading = 'Warning'282 }283 return result284}285export const decorateKeOptions = data => ({286 countries: optionizeObject(data.countries).map(item => {287 if (item.label === 'Global') {288 item.value = 'global'289 }290 return item291 }),292 currencies: optionizeObject(data.currencies).filter(293 item => item.value !== ''294 ),295 dataSources: optionizeObject({296 gkp: 'Google Keyword Planner',297 cli: 'GKP + Clickstream'298 })299})300export const decorateTrial = data => ({301 id: data.id,302 heading: data.trialProduct.heading,303 list: data.trialProduct.list,304 billableKeywords: data.trialProduct.billableKeywords,305 geoIp: data?.geoIp,306 updatedAt: data.updatedAt,307 timestampUpdated: formatTime(data.updatedAt),308 metrics: data?.metrics,309 paymentId: data?.paymentId310})311export const getSetsWithValues = values =>312 Object.entries(values).reduce((acc, cur) => {313 let temp = acc314 const [key, val] = cur315 if (val !== '') {316 temp.push(key)317 }318 return temp319 }, [])320export const findEnabledSets = (filled, disabled, values) =>321 filled.reduce((acc, cur) => {322 let temp = acc323 if (!disabled.includes(cur)) {324 temp[cur] = values[cur]325 }326 return temp...
Using AI Code Generation
1var BestTable = require('./bestTable.js');2var table1 = new BestTable();3table1.add('A', 1);4table1.add('B', 2);5table1.add('C', 3);6console.log(table1.stringifiedTables());7var BestTable = require('./bestTable.js');8var table1 = new BestTable();9table1.add('A', 1);10table1.add('B', 2);11table1.add('C', 3);12console.log(table1.stringifiedTables());13var BestTable = require('./bestTable.js');14var table1 = new BestTable();15table1.add('A', 1);16table1.add('B', 2);17table1.add('C', 3);18console.log(table1.stringifiedTables());19var BestTable = require('./bestTable.js');20var table1 = new BestTable();21table1.add('A', 1);22table1.add('B', 2);23table1.add('C', 3);24console.log(table1.stringifiedTables());25var BestTable = require('./bestTable.js');26var table1 = new BestTable();27table1.add('A', 1);28table1.add('B', 2);29table1.add('C', 3);30console.log(table1.stringifiedTables());31var BestTable = require('./bestTable.js');32var table1 = new BestTable();33table1.add('A', 1);34table1.add('B', 2);35table1.add('C', 3);36console.log(table1.stringifiedTables());37var BestTable = require('./bestTable.js');38var table1 = new BestTable();39table1.add('A', 1);40table1.add('B', 2);41table1.add('C', 3);42console.log(table1.stringifiedTables());
Using AI Code Generation
1var bestsellers = require('./bestsellers.js');2var table = bestsellers.bestsellerList;3var tables = table.stringifiedTables();4for (var i = 0; i < tables.length; i++) {5 console.log(tables[i]);6}7var bestsellers = require('./bestsellers.js');8var table = bestsellers.bestsellerList;9var tables = table.stringifiedTables();10for (var i = 0; i < tables.length; i++) {11 console.log(tables[i]);12}13var bestsellers = require('./bestsellers.js');14var table = bestsellers.bestsellerList;15var tables = table.stringifiedTables();16for (var i = 0; i < tables.length; i++) {17 console.log(tables[i]);18}19var bestsellers = require('./bestsellers.js');20var table = bestsellers.bestsellerList;21var tables = table.stringifiedTables();22for (var i = 0; i < tables.length; i++) {23 console.log(tables[i]);24}25var bestsellers = require('./bestsellers.js');26var table = bestsellers.bestsellerList;27var tables = table.stringifiedTables();28for (var i = 0; i < tables.length; i++) {29 console.log(tables[i]);30}31var bestsellers = require('./bestsellers.js');32var table = bestsellers.bestsellerList;33var tables = table.stringifiedTables();34for (var i = 0; i < tables.length; i++) {35 console.log(tables[i]);36}37var bestsellers = require('./bestsellers.js');38var table = bestsellers.bestsellerList;39var tables = table.stringifiedTables();40for (var i = 0;
Using AI Code Generation
1var fs = require('fs');2var BestBets = require('./bestbets.js');3var bestbets = new BestBets();4var stringified = bestbets.stringifiedTables();5fs.writeFile('bestbets.txt', stringified, function(err) {6 if(err) {7 console.log(err);8 } else {9 console.log("The file was saved!");10 }11});12{13 {14 },15 {16 }17}18var BestBets = require('./bestbets.js');19var bestbets = new BestBets();20addBestBet(query, url, description, callback)21 if(err) {22 console.log(err);23 } else {24 console.log('best
Using AI Code Generation
1var BestTable = require('./bestTable');2var table = new BestTable();3var data = {4};5var table = new BestTable();6var stringifiedTable = table.stringifiedTable(data);7console.log(stringifiedTable);8var BestTable = require('./bestTable');9var table = new BestTable();10 {11 },12 {13 }14];15var table = new BestTable();16var stringifiedTable = table.stringifiedTables(data);17console.log(stringifiedTable);18var Table = require('cli-table');19var _ = require('lodash');20var BestTable = function () {21};22BestTable.prototype.stringifiedTable = function (data) {23 var table = new Table({24 head: _.keys(data)25 });26 var row = [];27 _.forEach(data, function (value) {28 row.push(value);29 });30 table.push(row);31 return table.toString();32};33BestTable.prototype.stringifiedTables = function (data) {34 var table = new Table({35 head: _.keys(data[0])36 });37 _.forEach(data, function (row) {38 var rowArray = [];39 _.forEach(row, function (value) {40 rowArray.push(value);41 });42 table.push(rowArray);43 });44 return table.toString();45};46module.exports = BestTable;
Using AI Code Generation
1const BestTable = require('./BestTable');2const table = new BestTable();3table.add('Name', 'Age', 'Occupation');4table.add('Joe', 25, 'Developer');5table.add('Mary', 35, 'Manager');6table.add('Tom', 45, 'Director');7table.add('Sally', 55, 'CEO');8console.log(table.stringifiedTable());
Using AI Code Generation
1import {BestTable} from "./BestTable.js";2let bestTable = new BestTable();3 {a: 1, b: 2, c: 3},4 {a: 2, b: 3, c: 4},5 {a: 3, b: 4, c: 5},6 {a: 4, b: 5, c: 6},7 {a: 5, b: 6, c: 7},8 {a: 6, b: 7, c: 8},9 {a: 7, b: 8, c: 9},10 {a: 8, b: 9, c: 10},11 {a: 9, b: 10, c: 11},12 {a: 10, b: 11, c: 12},13 {a: 11, b: 12, c: 13},14 {a: 12, b: 13, c: 14},15 {a: 13, b: 14, c: 15},16 {a: 14, b: 15, c: 16},17 {a: 15, b: 16, c: 17},18 {a: 16, b: 17, c: 18},19 {a: 17, b: 18, c: 19},20 {a: 18, b: 19, c: 20},21 {a: 19, b: 20, c: 21},22 {a: 20, b: 21, c: 22},23 {a: 21, b: 22, c: 23},24 {a: 22, b: 23, c: 24},25 {a: 23, b: 24, c: 25},26 {a: 24, b: 25, c: 26},27 {a: 25, b: 26, c:
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!!