How to use CFFTopDict method in wpt

Best JavaScript code snippet using wpt

cff_parser.js

Source:cff_parser.js Github

copy

Full Screen

...981}();982var CFFTopDict = function CFFTopDictClosure() {983 var layout = [[[12, 30], 'ROS', ['sid', 'sid', 'num'], null], [[12, 20], 'SyntheticBase', 'num', null], [0, 'version', 'sid', null], [1, 'Notice', 'sid', null], [[12, 0], 'Copyright', 'sid', null], [2, 'FullName', 'sid', null], [3, 'FamilyName', 'sid', null], [4, 'Weight', 'sid', null], [[12, 1], 'isFixedPitch', 'num', 0], [[12, 2], 'ItalicAngle', 'num', 0], [[12, 3], 'UnderlinePosition', 'num', -100], [[12, 4], 'UnderlineThickness', 'num', 50], [[12, 5], 'PaintType', 'num', 0], [[12, 6], 'CharstringType', 'num', 2], [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'], [0.001, 0, 0, 0.001, 0, 0]], [13, 'UniqueID', 'num', null], [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]], [[12, 8], 'StrokeWidth', 'num', 0], [14, 'XUID', 'array', null], [15, 'charset', 'offset', 0], [16, 'Encoding', 'offset', 0], [17, 'CharStrings', 'offset', 0], [18, 'Private', ['offset', 'offset'], null], [[12, 21], 'PostScript', 'sid', null], [[12, 22], 'BaseFontName', 'sid', null], [[12, 23], 'BaseFontBlend', 'delta', null], [[12, 31], 'CIDFontVersion', 'num', 0], [[12, 32], 'CIDFontRevision', 'num', 0], [[12, 33], 'CIDFontType', 'num', 0], [[12, 34], 'CIDCount', 'num', 8720], [[12, 35], 'UIDBase', 'num', null], [[12, 37], 'FDSelect', 'offset', null], [[12, 36], 'FDArray', 'offset', null], [[12, 38], 'FontName', 'sid', null]];984 var tables = null;985 function CFFTopDict(strings) {986 if (tables === null) {987 tables = CFFDict.createTables(layout);988 }989 CFFDict.call(this, tables, strings);990 this.privateDict = null;991 }992 CFFTopDict.prototype = Object.create(CFFDict.prototype);993 return CFFTopDict;994}();995var CFFPrivateDict = function CFFPrivateDictClosure() {996 var layout = [[6, 'BlueValues', 'delta', null], [7, 'OtherBlues', 'delta', null], [8, 'FamilyBlues', 'delta', null], [9, 'FamilyOtherBlues', 'delta', null], [[12, 9], 'BlueScale', 'num', 0.039625], [[12, 10], 'BlueShift', 'num', 7], [[12, 11], 'BlueFuzz', 'num', 1], [10, 'StdHW', 'num', null], [11, 'StdVW', 'num', null], [[12, 12], 'StemSnapH', 'delta', null], [[12, 13], 'StemSnapV', 'delta', null], [[12, 14], 'ForceBold', 'num', 0], [[12, 17], 'LanguageGroup', 'num', 0], [[12, 18], 'ExpansionFactor', 'num', 0.06], [[12, 19], 'initialRandomSeed', 'num', 0], [20, 'defaultWidthX', 'num', 0], [21, 'nominalWidthX', 'num', 0], [19, 'Subrs', 'offset', null]];997 var tables = null;998 function CFFPrivateDict(strings) {999 if (tables === null) {...

Full Screen

Full Screen

CFFTop.js

Source:CFFTop.js Github

copy

Full Screen

1import r from 'restructure';2import { resolveLength } from 'restructure/src/utils';3import CFFDict from './CFFDict';4import CFFIndex from './CFFIndex';5import CFFPointer from './CFFPointer';6import CFFPrivateDict from './CFFPrivateDict';7import StandardStrings from './CFFStandardStrings';8import { StandardEncoding, ExpertEncoding } from './CFFEncodings';9import { ISOAdobeCharset, ExpertCharset, ExpertSubsetCharset } from './CFFCharsets';10import { ItemVariationStore } from '../tables/variations';11// Checks if an operand is an index of a predefined value,12// otherwise delegates to the provided type.13class PredefinedOp {14 constructor(predefinedOps, type) {15 this.predefinedOps = predefinedOps;16 this.type = type;17 }18 decode(stream, parent, operands) {19 if (this.predefinedOps[operands[0]]) {20 return this.predefinedOps[operands[0]];21 }22 return this.type.decode(stream, parent, operands);23 }24 size(value, ctx) {25 return this.type.size(value, ctx);26 }27 encode(stream, value, ctx) {28 let index = this.predefinedOps.indexOf(value);29 if (index !== -1) {30 return index;31 }32 return this.type.encode(stream, value, ctx);33 }34}35class CFFEncodingVersion extends r.Number {36 constructor() {37 super('UInt8');38 }39 decode(stream) {40 return r.uint8.decode(stream) & 0x7f;41 }42}43let Range1 = new r.Struct({44 first: r.uint16,45 nLeft: r.uint846});47let Range2 = new r.Struct({48 first: r.uint16,49 nLeft: r.uint1650});51let CFFCustomEncoding = new r.VersionedStruct(new CFFEncodingVersion(), {52 0: {53 nCodes: r.uint8,54 codes: new r.Array(r.uint8, 'nCodes')55 },56 1: {57 nRanges: r.uint8,58 ranges: new r.Array(Range1, 'nRanges')59 }60 // TODO: supplement?61});62let CFFEncoding = new PredefinedOp([ StandardEncoding, ExpertEncoding ], new CFFPointer(CFFCustomEncoding, { lazy: true }));63// Decodes an array of ranges until the total64// length is equal to the provided length.65class RangeArray extends r.Array {66 decode(stream, parent) {67 let length = resolveLength(this.length, stream, parent);68 let count = 0;69 let res = [];70 while (count < length) {71 let range = this.type.decode(stream, parent);72 range.offset = count;73 count += range.nLeft + 1;74 res.push(range);75 }76 return res;77 }78}79let CFFCustomCharset = new r.VersionedStruct(r.uint8, {80 0: {81 glyphs: new r.Array(r.uint16, t => t.parent.CharStrings.length - 1)82 },83 1: {84 ranges: new RangeArray(Range1, t => t.parent.CharStrings.length - 1)85 },86 2: {87 ranges: new RangeArray(Range2, t => t.parent.CharStrings.length - 1)88 }89});90let CFFCharset = new PredefinedOp([ ISOAdobeCharset, ExpertCharset, ExpertSubsetCharset ], new CFFPointer(CFFCustomCharset, {lazy: true}));91let FDRange3 = new r.Struct({92 first: r.uint16,93 fd: r.uint894});95let FDRange4 = new r.Struct({96 first: r.uint32,97 fd: r.uint1698});99let FDSelect = new r.VersionedStruct(r.uint8, {100 0: {101 fds: new r.Array(r.uint8, t => t.parent.CharStrings.length)102 },103 3: {104 nRanges: r.uint16,105 ranges: new r.Array(FDRange3, 'nRanges'),106 sentinel: r.uint16107 },108 4: {109 nRanges: r.uint32,110 ranges: new r.Array(FDRange4, 'nRanges'),111 sentinel: r.uint32112 }113});114let ptr = new CFFPointer(CFFPrivateDict);115class CFFPrivateOp {116 decode(stream, parent, operands) {117 parent.length = operands[0];118 return ptr.decode(stream, parent, [operands[1]]);119 }120 size(dict, ctx) {121 return [CFFPrivateDict.size(dict, ctx, false), ptr.size(dict, ctx)[0]];122 }123 encode(stream, dict, ctx) {124 return [CFFPrivateDict.size(dict, ctx, false), ptr.encode(stream, dict, ctx)[0]];125 }126}127let FontDict = new CFFDict([128 // key name type(s) default129 [18, 'Private', new CFFPrivateOp, null],130 [[12, 38], 'FontName', 'sid', null]131]);132let CFFTopDict = new CFFDict([133 // key name type(s) default134 [[12, 30], 'ROS', ['sid', 'sid', 'number'], null],135 [0, 'version', 'sid', null],136 [1, 'Notice', 'sid', null],137 [[12, 0], 'Copyright', 'sid', null],138 [2, 'FullName', 'sid', null],139 [3, 'FamilyName', 'sid', null],140 [4, 'Weight', 'sid', null],141 [[12, 1], 'isFixedPitch', 'boolean', false],142 [[12, 2], 'ItalicAngle', 'number', 0],143 [[12, 3], 'UnderlinePosition', 'number', -100],144 [[12, 4], 'UnderlineThickness', 'number', 50],145 [[12, 5], 'PaintType', 'number', 0],146 [[12, 6], 'CharstringType', 'number', 2],147 [[12, 7], 'FontMatrix', 'array', [0.001, 0, 0, 0.001, 0, 0]],148 [13, 'UniqueID', 'number', null],149 [5, 'FontBBox', 'array', [0, 0, 0, 0]],150 [[12, 8], 'StrokeWidth', 'number', 0],151 [14, 'XUID', 'array', null],152 [15, 'charset', CFFCharset, ISOAdobeCharset],153 [16, 'Encoding', CFFEncoding, StandardEncoding],154 [17, 'CharStrings', new CFFPointer(new CFFIndex), null],155 [18, 'Private', new CFFPrivateOp, null],156 [[12, 20], 'SyntheticBase', 'number', null],157 [[12, 21], 'PostScript', 'sid', null],158 [[12, 22], 'BaseFontName', 'sid', null],159 [[12, 23], 'BaseFontBlend', 'delta', null],160 // CID font specific161 [[12, 31], 'CIDFontVersion', 'number', 0],162 [[12, 32], 'CIDFontRevision', 'number', 0],163 [[12, 33], 'CIDFontType', 'number', 0],164 [[12, 34], 'CIDCount', 'number', 8720],165 [[12, 35], 'UIDBase', 'number', null],166 [[12, 37], 'FDSelect', new CFFPointer(FDSelect), null],167 [[12, 36], 'FDArray', new CFFPointer(new CFFIndex(FontDict)), null],168 [[12, 38], 'FontName', 'sid', null]169]);170let VariationStore = new r.Struct({171 length: r.uint16,172 itemVariationStore: ItemVariationStore173})174let CFF2TopDict = new CFFDict([175 [[12, 7], 'FontMatrix', 'array', [0.001, 0, 0, 0.001, 0, 0]],176 [17, 'CharStrings', new CFFPointer(new CFFIndex), null],177 [[12, 37], 'FDSelect', new CFFPointer(FDSelect), null],178 [[12, 36], 'FDArray', new CFFPointer(new CFFIndex(FontDict)), null],179 [24, 'vstore', new CFFPointer(VariationStore), null],180 [25, 'maxstack', 'number', 193]181]);182let CFFTop = new r.VersionedStruct(r.fixed16, {183 1: {184 hdrSize: r.uint8,185 offSize: r.uint8,186 nameIndex: new CFFIndex(new r.String('length')),187 topDictIndex: new CFFIndex(CFFTopDict),188 stringIndex: new CFFIndex(new r.String('length')),189 globalSubrIndex: new CFFIndex190 },191 2: {192 hdrSize: r.uint8,193 length: r.uint16,194 topDict: CFF2TopDict,195 globalSubrIndex: new CFFIndex196 }197});...

Full Screen

Full Screen

CFF.ts

Source:CFF.ts Github

copy

Full Screen

1import { SeqStream } from "bytestreamjs";2import { FontTable } from "../../Table";3import { CFFCharset } from "./CFFCharset";4import { CFFEncoding } from "./CFFEncoding";5import { CFFPrivateDICT } from "./CFFPrivateDICT";6import { CFFTopDICT } from "./CFFTopDICT";7import { INDEX } from "./IDX";8import { StringIndex } from "./StringIndex";9export interface CFFParameters {10 dicts?: CFFTopDICT[];11}12export class CFF extends FontTable {13 public dicts: CFFTopDICT[];14 constructor(parameters: CFFParameters = {}) {15 super();16 this.dicts = parameters.dicts || [];17 }18 static get tag() {19 return 0x43464620;20 }21 static fromStream(stream: SeqStream) {22 //#region Read header information23 const headerBlock = stream.getBlock(4);24 const header = {25 major: headerBlock[0],26 minor: headerBlock[1],27 hdrSize: headerBlock[2],28 offSize: headerBlock[3]29 };30 //#endregion31 //#region Read possible "extension bytes"32 stream.getBlock(header.hdrSize - 4);33 //#endregion34 //#region Read "Name INDEX"35 INDEX.fromStream(stream);36 //#endregion37 //#region Read "Top DICT INDEX"38 const topDICTIndex = INDEX.fromStream(stream);39 //#endregion40 //#region Read "String INDEX"41 const stringIndex = StringIndex.fromStream(stream);42 //#endregion43 //#region Read "Global Subr INDEX"44 INDEX.fromStream(stream);45 //#endregion46 //#region Parse "Top DICT"47 const dicts: CFFTopDICT[] = [];48 for (const data of topDICTIndex.data) {49 const dict = CFFTopDICT.fromBuffer(data, stringIndex);50 if (dict.Private) {51 const buffer = stream.stream.buffer.slice(dict.Private.offset, dict.Private.offset + dict.Private.size);52 dict.PrivateDICT = CFFPrivateDICT.fromBuffer(buffer);53 }54 if ("CharStrings" in dict) {55 dict.CharStringsINDEX = INDEX.fromStream(new SeqStream({ stream: stream.stream.slice(dict.CharStrings) }));56 dict.CharsetParsed = CFFCharset.fromStream(57 new SeqStream({ stream: stream.stream.slice(dict.charset) }),58 dict.CharStringsINDEX.data.length,59 stringIndex60 );61 switch (dict.Encoding) {62 case 0:63 break;64 case 1:65 break;66 case 2:67 dict.EncodingParsed = CFFEncoding.fromStream(new SeqStream({ stream: stream.stream.slice(dict.Encoding) }));68 break;69 default:70 }71 }72 dicts.push(dict);73 }74 //#endregion75 return new CFF({ dicts });76 }...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1var wpt = require('wpt');2var fs = require('fs');3var font = fs.readFileSync('font.ttf');4var font = new wpt.Font(font);5var cff = font.tables.cff;6var topDict = cff.topDictIndex[0];7console.log(topDict);8console.log(topDict.get('UniqueID'));9var wpt = require('wpt');10var fs = require('fs');11var font = fs.readFileSync('font.ttf');12var font = new wpt.Font(font);13var cff = font.tables.cff;14var topDict = cff.topDictIndex[0];15console.log(topDict);16console.log(topDict.get('UniqueID'));17var wpt = require('wpt');18var fs = require('fs');19var font = fs.readFileSync('font.ttf');20var font = new wpt.Font(font);21var cff = font.tables.cff;22var topDict = cff.topDictIndex[0];23console.log(topDict);24console.log(topDict.get('UniqueID'));25var wpt = require('wpt');26var fs = require('fs');27var font = fs.readFileSync('font.ttf');28var font = new wpt.Font(font);29var cff = font.tables.cff;30var topDict = cff.topDictIndex[0];31console.log(topDict);32console.log(topDict.get('UniqueID'));33var wpt = require('wpt');34var fs = require('fs');35var font = fs.readFileSync('font.ttf');36var font = new wpt.Font(font);37var cff = font.tables.cff;38var topDict = cff.topDictIndex[0];39console.log(topDict);40console.log(topDict.get('UniqueID'));41var wpt = require('wpt');42var fs = require('fs');43var font = fs.readFileSync('font.ttf');44var font = new wpt.Font(font);45var cff = font.tables.cff;46var topDict = cff.topDictIndex[0];47console.log(topDict);48console.log(topDict.get('UniqueID'));

Full Screen

Using AI Code Generation

copy

Full Screen

1var wptools = require('wptools');2var fs = require('fs');3var async = require('async');4var csv = require('fast-csv');5var cffTopDict = require('./cffTopDict.js');6var cffFontDict = require('./cffFontDict.js');7var cffPrivateDict = require('./cffPrivateDict.js');8var cffCharStrings = require('./cffCharStrings.js');9var cffEncoding = require('./cffEncoding.js');10var cffCharString = require('./cffCharString.js');11var cffSubrs = require('./cffSubrs.js');12var cffDict = require('./cffDict.js');13var cffIndex = require('./cffIndex.js');14var cffString = require('./cffString.js');15var cffParser = require('./cffParser.js');16var cff = require('./cff.js');17var cffTopDicts = [];18var cffFontDicts = [];19var cffPrivateDicts = [];20var cffCharStrings = [];21var cffEncodings = [];22var cffCharStrings = [];23var cffSubrs = [];24var cffDicts = [];25var cffIndexes = [];26var cffStrings = [];27var cffParsers = [];28var cffs = [];29var cffTopDict = new cffTopDict();30var cffFontDict = new cffFontDict();31var cffPrivateDict = new cffPrivateDict();32var cffCharStrings = new cffCharStrings();33var cffEncoding = new cffEncoding();34var cffCharString = new cffCharString();35var cffSubrs = new cffSubrs();36var cffDict = new cffDict();37var cffIndex = new cffIndex();38var cffString = new cffString();39var cffParser = new cffParser();40var cff = new cff();41var cffTopDict = new cffTopDict();42var cffFontDict = new cffFontDict();43var cffPrivateDict = new cffPrivateDict();44var cffCharStrings = new cffCharStrings();45var cffEncoding = new cffEncoding();46var cffCharString = new cffCharString();47var cffSubrs = new cffSubrs();48var cffDict = new cffDict();49var cffIndex = new cffIndex();

Full Screen

Using AI Code Generation

copy

Full Screen

1var wptools = require('wptools');2var wp = new wptools('Barack Obama');3wp.getTopDict(function(err, topDict){4 if(err){5 console.log(err);6 return;7 }8 console.log(topDict);9});10var wptools = require('wptools');11var wp = new wptools('Barack Obama');12wp.getTopDict(function(err, topDict){13 if(err){14 console.log(err);15 return;16 }17 console.log(topDict);18});19var wptools = require('wptools');20var wp = new wptools('Barack Obama');21wp.getTopDict(function(err, topDict){22 if(err){23 console.log(err);24 return;25 }26 console.log(topDict);27});28var wptools = require('wptools');29var wp = new wptools('Barack Obama');30wp.getTopDict(function(err, topDict){31 if(err){32 console.log(err);33 return;34 }35 console.log(topDict);36});37var wptools = require('wptools');38var wp = new wptools('Barack Obama');39wp.getTopDict(function(err, topDict){40 if(err){41 console.log(err);42 return;43 }44 console.log(topDict);45});46var wptools = require('wptools');47var wp = new wptools('Barack Obama');48wp.getTopDict(function(err, topDict){49 if(err){50 console.log(err);51 return;52 }53 console.log(topDict);54});55var wptools = require('wptools');56var wp = new wptools('Barack Obama');57wp.getTopDict(function(err, topDict){58 if(err){59 console.log(err);60 return;61 }62 console.log(topDict);63});64var wptools = require('wptools');65var wp = new wptools('Barack

Full Screen

Using AI Code Generation

copy

Full Screen

1var wptools = require('./wptools.js');2var fs = require('fs');3var path = require('path');4var fontFile = fs.readFileSync('./fonts/arial.ttf');5var font = wptools.parse(fontFile);6var topDict = font.CFF.topDict;7var firstGlyph = topDict.CharStrings[0];8var firstGlyphName = firstGlyph.name;9console.log('The first glyph in the font is ' + firstGlyphName);10var lastGlyph = topDict.CharStrings[topDict.CharStrings.length - 1];11var lastGlyphName = lastGlyph.name;12console.log('The last glyph in the font is ' + lastGlyphName);13var numGlyphs = topDict.CharStrings.length;14console.log('There are ' + numGlyphs + ' glyphs in the font');15var familyName = topDict.FamilyName;16console.log('The font family name is ' + familyName);17var fullName = topDict.FullName;18console.log('The font full name is ' + fullName);19var version = topDict.version;20console.log('The font version is ' + version);21var psName = topDict.FontName;22console.log('The font ps name is ' + psName);23var italicAngle = topDict.italicAngle;24console.log('The font italic angle is ' + italicAngle);25var underlinePosition = topDict.underlinePosition;26console.log('The font underline position is ' + underlinePosition);27var underlineThickness = topDict.underlineThickness;28console.log('The font underline thickness is ' + underlineThickness);29var isFixedPitch = topDict.isFixedPitch;30console.log('The font isFixedPitch is ' + isFixedPitch);31var boundingBox = topDict.FontBBox;32console.log('The font bounding box is ' + boundingBox);33var xHeight = topDict.xHeight;34console.log('The font x height is ' + xHeight);

Full Screen

Using AI Code Generation

copy

Full Screen

1var cffTopDict = new CFFTopDict();2cffTopDict.setCFFString("test");3cffTopDict.setCFFString("test1");4cffTopDict.setCFFString("test2");5var cffTopDict = new CFFTopDict();6cffTopDict.setCFFString("test");7cffTopDict.setCFFString("test1");8cffTopDict.setCFFString("test2");9var cffTopDict = new CFFTopDict();10cffTopDict.setCFFString("test");11cffTopDict.setCFFString("test1");12cffTopDict.setCFFString("test2");13var cffTopDict = new CFFTopDict();14cffTopDict.setCFFString("test");15cffTopDict.setCFFString("test1");16cffTopDict.setCFFString("test2");17var cffTopDict = new CFFTopDict();18cffTopDict.setCFFString("test");19cffTopDict.setCFFString("test1");20cffTopDict.setCFFString("test2");21var cffTopDict = new CFFTopDict();22cffTopDict.setCFFString("test");23cffTopDict.setCFFString("test1");24cffTopDict.setCFFString("test2");25var cffTopDict = new CFFTopDict();26cffTopDict.setCFFString("test");27cffTopDict.setCFFString("test1");28cffTopDict.setCFFString("test2");29var cffTopDict = new CFFTopDict();30cffTopDict.setCFFString("test");31cffTopDict.setCFFString("test1");32cffTopDict.setCFFString("test2");33var cffTopDict = new CFFTopDict();34cffTopDict.setCFFString("test");35cffTopDict.setCFFString("test1");36cffTopDict.setCFFString("test

Full Screen

Using AI Code Generation

copy

Full Screen

1var font = new CFFFont();2var topDict = new CFFTopDict(font);3topDict.setDictData(dictData);4topDict.parse();5var fontName = topDict.data.fontName.value;6var isFixedPitch = topDict.data.isFixedPitch.value;7var italicAngle = topDict.data.italicAngle.value;8var underlinePosition = topDict.data.underlinePosition.value;9var underlineThickness = topDict.data.underlineThickness.value;10var paintType = topDict.data.paintType.value;11var charstringType = topDict.data.charstringType.value;12var fontMatrix = topDict.data.fontMatrix.value;13var uniqueID = topDict.data.uniqueID.value;14var fontBBox = topDict.data.fontBBox.value;15var strokeWidth = topDict.data.strokeWidth.value;16var charset = topDict.data.charset.value;17var encoding = topDict.data.encoding.value;18var charStrings = topDict.data.charStrings.value;19var privateDict = topDict.data.private.value;20var font = new CFFFont();21var privateDict = new CFFPrivateDict(font);22privateDict.setDictData(dictData);23privateDict.parse();24var blueValues = privateDict.data.blueValues.value;25var otherBlues = privateDict.data.otherBlues.value;26var familyBlues = privateDict.data.familyBlues.value;27var familyOtherBlues = privateDict.data.familyOtherBlues.value;28var blueScale = privateDict.data.blueScale.value;29var blueShift = privateDict.data.blueShift.value;30var blueFuzz = privateDict.data.blueFuzz.value;31var stdHW = privateDict.data.stdHW.value;32var stdVW = privateDict.data.stdVW.value;33var stemSnapH = privateDict.data.stemSnapH.value;34var stemSnapV = privateDict.data.stemSnapV.value;35var forceBold = privateDict.data.forceBold.value;36var languageGroup = privateDict.data.languageGroup.value;37var expansionFactor = privateDict.data.expansionFactor.value;38var initialRandomSeed = privateDict.data.initialRandomSeed.value;39var defaultWidthX = privateDict.data.defaultWidthX.value;40var nominalWidthX = privateDict.data.nominalWidthX.value;41var font = new CFFFont();

Full Screen

Automation Testing Tutorials

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.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run wpt automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful