How to use New method of cdp Package

Best Rod code snippet using cdp.New

chromedp.go

Source:chromedp.go Github

copy

Full Screen

...16 "github.com/incognito-core-libs/chromedp/client"17 "github.com/incognito-core-libs/chromedp/runner"18)19const (20 // DefaultNewTargetTimeout is the default time to wait for a new target to21 // be started.22 DefaultNewTargetTimeout = 3 * time.Second23 // DefaultCheckDuration is the default time to sleep between a check.24 DefaultCheckDuration = 50 * time.Millisecond25 // DefaultPoolStartPort is the default start port number.26 DefaultPoolStartPort = 900027 // DefaultPoolEndPort is the default end port number.28 DefaultPoolEndPort = 1000029)30// CDP is the high-level Chrome DevTools Protocol browser manager, handling the31// browser process runner, WebSocket clients, associated targets, and network,32// page, and DOM events.33type CDP struct {34 // r is the chrome runner.35 r *runner.Runner36 // opts are command line options to pass to a created runner.37 opts []runner.CommandLineOption38 // watch is the channel for new client targets.39 watch <-chan client.Target40 // cur is the current active target's handler.41 cur cdp.Executor42 // handlers is the active handlers.43 handlers []*TargetHandler44 // handlerMap is the map of target IDs to its active handler.45 handlerMap map[string]int46 // logging funcs47 logf, debugf, errf func(string, ...interface{})48 sync.RWMutex49}50// New creates and starts a new CDP instance.51func New(ctxt context.Context, opts ...Option) (*CDP, error) {52 c := &CDP{53 handlers: make([]*TargetHandler, 0),54 handlerMap: make(map[string]int),55 logf: log.Printf,56 debugf: func(string, ...interface{}) {},57 errf: func(s string, v ...interface{}) { log.Printf("error: "+s, v...) },58 }59 // apply options60 for _, o := range opts {61 if err := o(c); err != nil {62 return nil, err63 }64 }65 // check for supplied runner, if none then create one66 if c.r == nil && c.watch == nil {67 var err error68 c.r, err = runner.Run(ctxt, c.opts...)69 if err != nil {70 return nil, err71 }72 }73 // watch handlers74 if c.watch == nil {75 c.watch = c.r.Client().WatchPageTargets(ctxt)76 }77 go func() {78 for t := range c.watch {79 if t == nil {80 return81 }82 go c.AddTarget(ctxt, t)83 }84 }()85 // TODO: fix this86 timeout := time.After(defaultNewTargetTimeout)87 // wait until at least one target active88 for {89 select {90 default:91 c.RLock()92 exists := c.cur != nil93 c.RUnlock()94 if exists {95 return c, nil96 }97 // TODO: fix this98 time.Sleep(DefaultCheckDuration)99 case <-ctxt.Done():100 return nil, ctxt.Err()101 case <-timeout:102 return nil, errors.New("timeout waiting for initial target")103 }104 }105}106// AddTarget adds a target using the supplied context.107func (c *CDP) AddTarget(ctxt context.Context, t client.Target) {108 c.Lock()109 defer c.Unlock()110 // create target manager111 h, err := NewTargetHandler(t, c.logf, c.debugf, c.errf)112 if err != nil {113 c.errf("could not create handler for %s: %v", t, err)114 return115 }116 // run117 if err := h.Run(ctxt); err != nil {118 c.errf("could not start handler for %s: %v", t, err)119 return120 }121 // add to active handlers122 c.handlers = append(c.handlers, h)123 c.handlerMap[t.GetID()] = len(c.handlers) - 1124 if c.cur == nil {125 c.cur = h126 }127}128// Wait waits for the Chrome runner to terminate.129func (c *CDP) Wait() error {130 c.RLock()131 r := c.r132 c.RUnlock()133 if r != nil {134 return r.Wait()135 }136 return nil137}138// Shutdown closes all Chrome page handlers.139func (c *CDP) Shutdown(ctxt context.Context, opts ...client.Option) error {140 c.RLock()141 defer c.RUnlock()142 if c.r != nil {143 return c.r.Shutdown(ctxt, opts...)144 }145 return nil146}147// ListTargets returns the target IDs of the managed targets.148func (c *CDP) ListTargets() []string {149 c.RLock()150 defer c.RUnlock()151 i, targets := 0, make([]string, len(c.handlers))152 for k := range c.handlerMap {153 targets[i] = k154 i++155 }156 return targets157}158// GetHandlerByIndex retrieves the domains manager for the specified index.159func (c *CDP) GetHandlerByIndex(i int) cdp.Executor {160 c.RLock()161 defer c.RUnlock()162 if i < 0 || i >= len(c.handlers) {163 return nil164 }165 return c.handlers[i]166}167// GetHandlerByID retrieves the domains manager for the specified target ID.168func (c *CDP) GetHandlerByID(id string) cdp.Executor {169 c.RLock()170 defer c.RUnlock()171 if i, ok := c.handlerMap[id]; ok {172 return c.handlers[i]173 }174 return nil175}176// SetHandler sets the active handler to the target with the specified index.177func (c *CDP) SetHandler(i int) error {178 c.Lock()179 defer c.Unlock()180 if i < 0 || i >= len(c.handlers) {181 return fmt.Errorf("no handler associated with target index %d", i)182 }183 c.cur = c.handlers[i]184 return nil185}186// SetHandlerByID sets the active target to the target with the specified id.187func (c *CDP) SetHandlerByID(id string) error {188 c.Lock()189 defer c.Unlock()190 if i, ok := c.handlerMap[id]; ok {191 c.cur = c.handlers[i]192 return nil193 }194 return fmt.Errorf("no handler associated with target id %s", id)195}196// newTarget creates a new target using supplied context and options, returning197// the id of the created target only after the target has been started for198// monitoring.199func (c *CDP) newTarget(ctxt context.Context, opts ...client.Option) (string, error) {200 c.RLock()201 cl := c.r.Client(opts...)202 c.RUnlock()203 // new page target204 t, err := cl.NewPageTarget(ctxt)205 if err != nil {206 return "", err207 }208 timeout := time.After(DefaultNewTargetTimeout)209 for {210 select {211 default:212 var ok bool213 id := t.GetID()214 c.RLock()215 _, ok = c.handlerMap[id]216 c.RUnlock()217 if ok {218 return id, nil219 }220 time.Sleep(DefaultCheckDuration)221 case <-ctxt.Done():222 return "", ctxt.Err()223 case <-timeout:224 return "", errors.New("timeout waiting for new target to be available")225 }226 }227}228// SetTarget is an action that sets the active Chrome handler to the specified229// index i.230func (c *CDP) SetTarget(i int) Action {231 return ActionFunc(func(context.Context, cdp.Executor) error {232 return c.SetHandler(i)233 })234}235// SetTargetByID is an action that sets the active Chrome handler to the handler236// associated with the specified id.237func (c *CDP) SetTargetByID(id string) Action {238 return ActionFunc(func(context.Context, cdp.Executor) error {239 return c.SetHandlerByID(id)240 })241}242// NewTarget is an action that creates a new Chrome target, and sets it as the243// active target.244func (c *CDP) NewTarget(id *string, opts ...client.Option) Action {245 return ActionFunc(func(ctxt context.Context, h cdp.Executor) error {246 n, err := c.newTarget(ctxt, opts...)247 if err != nil {248 return err249 }250 if id != nil {251 *id = n252 }253 return nil254 })255}256// CloseByIndex closes the Chrome target with specified index i.257func (c *CDP) CloseByIndex(i int) Action {258 return ActionFunc(func(ctxt context.Context, h cdp.Executor) error {259 return nil260 })261}262// CloseByID closes the Chrome target with the specified id.263func (c *CDP) CloseByID(id string) Action {264 return ActionFunc(func(ctxt context.Context, h cdp.Executor) error {265 return nil266 })267}268// Run executes the action against the current target using the supplied269// context.270func (c *CDP) Run(ctxt context.Context, a Action) error {271 c.RLock()272 cur := c.cur273 c.RUnlock()274 return a.Do(ctxt, cur)275}276// Option is a Chrome DevTools Protocol option.277type Option func(*CDP) error278// WithRunner is a CDP option to specify the underlying Chrome runner to279// monitor for page handlers.280func WithRunner(r *runner.Runner) Option {281 return func(c *CDP) error {282 c.r = r283 return nil284 }285}286// WithTargets is a CDP option to specify the incoming targets to monitor for287// page handlers.288func WithTargets(watch <-chan client.Target) Option {289 return func(c *CDP) error {290 c.watch = watch291 return nil292 }293}294// WithClient is a CDP option to use the incoming targets from a client.295func WithClient(ctxt context.Context, cl *client.Client) Option {296 return func(c *CDP) error {297 return WithTargets(cl.WatchPageTargets(ctxt))(c)298 }299}300// WithURL is a CDP option to use a client with the specified URL.301func WithURL(ctxt context.Context, urlstr string) Option {302 return func(c *CDP) error {303 return WithClient(ctxt, client.New(client.URL(urlstr)))(c)304 }305}306// WithRunnerOptions is a CDP option to specify the options to pass to a newly307// created Chrome process runner.308func WithRunnerOptions(opts ...runner.CommandLineOption) Option {309 return func(c *CDP) error {310 c.opts = opts311 return nil312 }313}314// WithLogf is a CDP option to specify a func to receive general logging.315func WithLogf(f func(string, ...interface{})) Option {316 return func(c *CDP) error {317 c.logf = f318 return nil319 }320}321// WithDebugf is a CDP option to specify a func to receive debug logging (ie,322// protocol information).323func WithDebugf(f func(string, ...interface{})) Option {324 return func(c *CDP) error {325 c.debugf = f326 return nil327 }328}329// WithErrorf is a CDP option to specify a func to receive error logging.330func WithErrorf(f func(string, ...interface{})) Option {331 return func(c *CDP) error {332 c.errf = f333 return nil334 }335}336// WithLog is a CDP option that sets the logging, debugging, and error funcs to337// f.338func WithLog(f func(string, ...interface{})) Option {339 return func(c *CDP) error {340 c.logf, c.debugf, c.errf = f, f, f341 return nil342 }343}344// WithConsolef is a CDP option to specify a func to receive chrome log events.345//346// Note: NOT YET IMPLEMENTED.347func WithConsolef(f func(string, ...interface{})) Option {348 return func(c *CDP) error {349 return nil350 }351}352var (353 // defaultNewTargetTimeout is the default target timeout -- used by354 // testing.355 defaultNewTargetTimeout = DefaultNewTargetTimeout356)...

Full Screen

Full Screen

rewards.go

Source:rewards.go Github

copy

Full Screen

...59 }60 claim, found := k.GetCdpMintingClaim(ctx, cdp.Owner.AccAddress())61 denoms, _ := k.GetGenesisDenoms(ctx)62 if !found { // this is the owner's first jpu minting reward claim63 claim = types.NewCdpMintingClaim(cdp.Owner.AccAddress(), sdk.NewCoin(denoms.CdpMintingRewardDenom, sdk.ZeroInt()), types.RewardIndexes{types.NewRewardIndex(cdp.Type, rewardFactor)})64 k.SetCdpMintingClaim(ctx, claim)65 return66 }67 // the owner has an existing jpu minting reward claim68 index, hasRewardIndex := claim.HasRewardIndex(cdp.Type)69 if !hasRewardIndex { // this is the owner's first jpu minting reward for this collateral type70 claim.RewardIndexes = append(claim.RewardIndexes, types.NewRewardIndex(cdp.Type, rewardFactor))71 } else { // the owner has a previous jpu minting reward for this collateral type72 claim.RewardIndexes[index] = types.NewRewardIndex(cdp.Type, rewardFactor)73 }74 k.SetCdpMintingClaim(ctx, claim)75}76// SynchronizeCdpMintingReward updates the claim object by adding any accumulated rewards and updating the reward index value.77// this should be called before a cdp is modified, immediately after the 'SynchronizeInterest' method is called in the cdp module78func (k Keeper) SynchronizeCdpMintingReward(ctx sdk.Context, cdp cdptypes.Cdp) {79 _, found := k.GetCdpMintingRewardPeriod(ctx, cdp.Type)80 if !found {81 // this collateral type is not incentivized, do nothing82 return83 }84 globalRewardFactor, found := k.GetCdpMintingRewardFactor(ctx, cdp.Type)85 if !found {86 globalRewardFactor = sdk.ZeroDec()87 }88 claim, found := k.GetCdpMintingClaim(ctx, cdp.Owner.AccAddress())89 denoms, _ := k.GetGenesisDenoms(ctx)90 if !found {91 claim = types.NewCdpMintingClaim(cdp.Owner.AccAddress(), sdk.NewCoin(denoms.CdpMintingRewardDenom, sdk.ZeroInt()), types.RewardIndexes{types.NewRewardIndex(cdp.Type, globalRewardFactor)})92 k.SetCdpMintingClaim(ctx, claim)93 return94 }95 // the owner has an existing jpu minting reward claim96 index, hasRewardIndex := claim.HasRewardIndex(cdp.Type)97 if !hasRewardIndex { // this is the owner's first jpu minting reward for this collateral type98 claim.RewardIndexes = append(claim.RewardIndexes, types.NewRewardIndex(cdp.Type, globalRewardFactor))99 k.SetCdpMintingClaim(ctx, claim)100 return101 }102 userRewardFactor := claim.RewardIndexes[index].RewardFactor103 rewardsAccumulatedFactor := globalRewardFactor.Sub(userRewardFactor)104 if rewardsAccumulatedFactor.IsZero() {105 return106 }107 claim.RewardIndexes[index].RewardFactor = globalRewardFactor108 newRewardsAmount := rewardsAccumulatedFactor.Mul(cdp.GetTotalPrincipal().Amount.ToDec()).RoundInt()109 if newRewardsAmount.IsZero() {110 k.SetCdpMintingClaim(ctx, claim)111 return112 }113 newRewardsCoin := sdk.NewCoin(denoms.CdpMintingRewardDenom, newRewardsAmount)114 claim.Reward = claim.Reward.Add(newRewardsCoin)115 k.SetCdpMintingClaim(ctx, claim)116 return117}118// ZeroCdpMintingClaim zeroes out the claim object's rewards and returns the updated claim object119func (k Keeper) ZeroCdpMintingClaim(ctx sdk.Context, claim types.CdpMintingClaim) types.CdpMintingClaim {120 claim.Reward = sdk.NewCoin(claim.Reward.Denom, sdk.ZeroInt())121 k.SetCdpMintingClaim(ctx, claim)122 return claim123}124// SynchronizeCdpMintingClaim updates the claim object by adding any rewards that have accumulated.125// Returns the updated claim object126func (k Keeper) SynchronizeCdpMintingClaim(ctx sdk.Context, claim types.CdpMintingClaim) (types.CdpMintingClaim, error) {127 for _, ri := range claim.RewardIndexes {128 cdp, found := k.cdpKeeper.GetCdpByOwnerAndCollateralType(ctx, claim.Owner.AccAddress(), ri.CollateralType)129 if !found {130 // if the cdp for this collateral type has been closed, no updates are needed131 continue132 }133 claim = k.synchronizeRewardAndReturnClaim(ctx, cdp)134 }135 return claim, nil136}137// this function assumes a claim already exists, so don't call it if that's not the case138func (k Keeper) synchronizeRewardAndReturnClaim(ctx sdk.Context, cdp cdptypes.Cdp) types.CdpMintingClaim {139 k.SynchronizeCdpMintingReward(ctx, cdp)140 claim, _ := k.GetCdpMintingClaim(ctx, cdp.Owner.AccAddress())141 return claim142}143// CalculateTimeElapsed calculates the number of reward-eligible seconds that have passed since the previous144// time rewards were accrued, taking into account the end time of the reward period145func CalculateTimeElapsed(start, end, blockTime time.Time, previousAccrualTime time.Time) sdk.Int {146 if (end.Before(blockTime) &&147 (end.Before(previousAccrualTime) || end.Equal(previousAccrualTime))) ||148 (start.After(blockTime)) ||149 (start.Equal(blockTime)) {150 return sdk.ZeroInt()151 }152 if start.After(previousAccrualTime) && start.Before(blockTime) {153 previousAccrualTime = start154 }155 if end.Before(blockTime) {156 return sdk.MaxInt(sdk.ZeroInt(), sdk.NewInt(int64(math.RoundToEven(157 end.Sub(previousAccrualTime).Seconds(),158 ))))159 }160 return sdk.MaxInt(sdk.ZeroInt(), sdk.NewInt(int64(math.RoundToEven(161 blockTime.Sub(previousAccrualTime).Seconds(),162 ))))163}164// SimulateCdpMintingSynchronization calculates a user's outstanding Cdp minting rewards by simulating reward synchronization165func (k Keeper) SimulateCdpMintingSynchronization(ctx sdk.Context, claim types.CdpMintingClaim) types.CdpMintingClaim {166 for _, ri := range claim.RewardIndexes {167 _, found := k.GetCdpMintingRewardPeriod(ctx, ri.CollateralType)168 if !found {169 continue170 }171 globalRewardFactor, found := k.GetCdpMintingRewardFactor(ctx, ri.CollateralType)172 if !found {173 globalRewardFactor = sdk.ZeroDec()174 }175 // the owner has an existing jpu minting reward claim176 index, hasRewardIndex := claim.HasRewardIndex(ri.CollateralType)177 if !hasRewardIndex { // this is the owner's first jpu minting reward for this collateral type178 claim.RewardIndexes = append(claim.RewardIndexes, types.NewRewardIndex(ri.CollateralType, globalRewardFactor))179 }180 userRewardFactor := claim.RewardIndexes[index].RewardFactor181 rewardsAccumulatedFactor := globalRewardFactor.Sub(userRewardFactor)182 if rewardsAccumulatedFactor.IsZero() {183 continue184 }185 claim.RewardIndexes[index].RewardFactor = globalRewardFactor186 cdp, found := k.cdpKeeper.GetCdpByOwnerAndCollateralType(ctx, claim.GetOwner(), ri.CollateralType)187 if !found {188 continue189 }190 newRewardsAmount := rewardsAccumulatedFactor.Mul(cdp.GetTotalPrincipal().Amount.ToDec()).RoundInt()191 if newRewardsAmount.IsZero() {192 continue193 }194 denoms, _ := k.GetGenesisDenoms(ctx)195 newRewardsCoin := sdk.NewCoin(denoms.CdpMintingRewardDenom, newRewardsAmount)196 claim.Reward = claim.Reward.Add(newRewardsCoin)197 }198 return claim199}...

Full Screen

Full Screen

cdp.go

Source:cdp.go Github

copy

Full Screen

...6 "time"7 sdk "github.com/cosmos/cosmos-sdk/types"8 sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"9)10// NewCdp creates a new Cdp object11func NewCdp(id uint64, owner sdk.AccAddress, collateral sdk.Coin, collateralType string, principal sdk.Coin, time time.Time, interestFactor sdk.Dec) Cdp {12 fees := sdk.NewCoin(principal.Denom, sdk.ZeroInt())13 return Cdp{14 Id: id,15 Owner: owner.Bytes(),16 Type: collateralType,17 Collateral: collateral,18 Principal: principal,19 AccumulatedFees: fees,20 FeesUpdated: time,21 InterestFactor: interestFactor,22 }23}24// NewCdpWithFees creates a new Cdp object, for use during migration25func NewCdpWithFees(id uint64, owner sdk.AccAddress, collateral sdk.Coin, collateralType string, principal, fees sdk.Coin, time time.Time, interestFactor sdk.Dec) Cdp {26 return Cdp{27 Id: id,28 Owner: owner.Bytes(),29 Type: collateralType,30 Collateral: collateral,31 Principal: principal,32 AccumulatedFees: fees,33 FeesUpdated: time,34 InterestFactor: interestFactor,35 }36}37// Validate performs a basic validation of the Cdp fields.38func (cdp Cdp) Validate() error {39 if cdp.Id == 0 {40 return errors.New("cdp id cannot be 0")41 }42 if cdp.Owner.AccAddress().Empty() {43 return errors.New("cdp owner cannot be empty")44 }45 if !cdp.Collateral.IsValid() {46 return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "collateral %s", cdp.Collateral)47 }48 if !cdp.Principal.IsValid() {49 return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "principal %s", cdp.Principal)50 }51 if !cdp.AccumulatedFees.IsValid() {52 return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "accumulated fees %s", cdp.AccumulatedFees)53 }54 if cdp.FeesUpdated.Unix() <= 0 {55 return errors.New("cdp updated fee time cannot be zero")56 }57 if strings.TrimSpace(cdp.Type) == "" {58 return fmt.Errorf("cdp type cannot be empty")59 }60 return nil61}62// GetTotalPrincipal returns the total principle for the cdp63func (cdp Cdp) GetTotalPrincipal() sdk.Coin {64 return cdp.Principal.Add(cdp.AccumulatedFees)65}66// Cdps a collection of Cdp objects67type Cdps []Cdp68// String implements stringer69func (cdps Cdps) String() string {70 out := ""71 for _, cdp := range cdps {72 out += cdp.String() + "\n"73 }74 return out75}76// Validate validates each Cdp77func (cdps Cdps) Validate() error {78 for _, cdp := range cdps {79 if err := cdp.Validate(); err != nil {80 return err81 }82 }83 return nil84}85// NewAugmentedCdp creates a new AugmentedCdp object86func NewAugmentedCdp(cdp Cdp, collateralValue sdk.Coin, collateralizationRatio sdk.Dec) AugmentedCdp {87 augmentedCdp := AugmentedCdp{88 Cdp: Cdp{89 Id: cdp.Id,90 Owner: cdp.Owner,91 Type: cdp.Type,92 Collateral: cdp.Collateral,93 Principal: cdp.Principal,94 AccumulatedFees: cdp.AccumulatedFees,95 FeesUpdated: cdp.FeesUpdated,96 InterestFactor: cdp.InterestFactor,97 },98 CollateralValue: collateralValue,99 CollateralizationRatio: collateralizationRatio,100 }...

Full Screen

Full Screen

New

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 mc := memcache.New("localhost:11211")4 mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value")})5 item, err := mc.Get("foo")6 if err != nil {7 panic(err)8 }9 fmt.Printf("key=%s, value=%s10}11import (12func main() {13 mc := memcache.New("localhost:11211")14 mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value")})15 item, err := mc.Get("foo")16 if err != nil {17 panic(err)18 }19 fmt.Printf("key=%s, value=%s20}21import (22func main() {23 mc := memcache.New("localhost:11211")24 mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value")})25 item, err := mc.Get("foo")26 if err != nil {27 panic(err)28 }29 fmt.Printf("key=%s, value=%s30}31import (32func main() {33 mc := memcache.New("localhost:11211")34 mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value")})35 item, err := mc.Get("foo")36 if err != nil {37 panic(err)38 }39 fmt.Printf("key=%s, value=%s40}41import (

Full Screen

Full Screen

New

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 vm := otto.New()4 vm.Run(`5 var cdp = require('cdp');6 var client = cdp();7 client.New().then((target) => {8 console.log(target);9 });10 value, _ := vm.Get("target")11 fmt.Println(value)12}13import (14func main() {15 c := make(chan string)16 go count("sheep", c)17 for {18 if !open {19 }20 fmt.Println(msg)21 }22}23func count(thing string, c chan string) {24 for i := 1; ; i++ {25 time.Sleep(time.Millisecond * 500)26 }27}

Full Screen

Full Screen

New

Using AI Code Generation

copy

Full Screen

1import "fmt"2type cdp struct {3}4func main() {5 c := cdp{1, 2}6 fmt.Println(c)7}8{1 2}9{1 2}

Full Screen

Full Screen

New

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 client := cdp.New()4 client := cdp.New(cdp.Config{5 Auth: cdp.Auth{6 },7 })8}9import (10func main() {11 client := cdp.NewWithConfig()12 client := cdp.NewWithConfig(cdp.Config{13 Auth: cdp.Auth{14 },15 })16}17import (18func main() {19 client := cdp.NewWithConfig()20 client := cdp.NewWithConfig(cdp.Config{

Full Screen

Full Screen

New

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 cdp1.New(100, 10, 1, 1)4 fmt.Println(cdp1)5}6{100 10 1 1}

Full Screen

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.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful