Best Puppeteer-sharp code snippet using PuppeteerSharp.States.ExitingState.EnterFromAsync
ChromiumProcess.cs
Source:ChromiumProcess.cs
...381 #endregion382 #region Concrete state classes383 private class InitialState : State384 {385 public override Task StartAsync(ChromiumProcess p) => Starting.EnterFromAsync(p, this);386 public override Task ExitAsync(ChromiumProcess p, TimeSpan timeout)387 {388 Exited.EnterFrom(p, this);389 return Task.CompletedTask;390 }391 public override Task KillAsync(ChromiumProcess p)392 {393 Exited.EnterFrom(p, this);394 return Task.CompletedTask;395 }396 public override Task WaitForExitAsync(ChromiumProcess p) => Task.FromException(InvalidOperation("wait for exit"));397 }398 private class StartingState : State399 {400 public Task EnterFromAsync(ChromiumProcess p, State fromState)401 {402 if (!TryEnter(p, fromState))403 {404 // Delegate StartAsync to current state, because it has already changed since405 // transition to this state was initiated.406 return p._currentState.StartAsync(p);407 }408 return StartCoreAsync(p);409 }410 public override Task StartAsync(ChromiumProcess p) => p._startCompletionSource.Task;411 public override Task ExitAsync(ChromiumProcess p, TimeSpan timeout) => Exiting.EnterFromAsync(p, this, timeout);412 public override Task KillAsync(ChromiumProcess p) => Killing.EnterFromAsync(p, this);413 public override void Dispose(ChromiumProcess p)414 {415 p._startCompletionSource.TrySetException(new ObjectDisposedException(p.ToString()));416 base.Dispose(p);417 }418 private async Task StartCoreAsync(ChromiumProcess p)419 {420 var output = new StringBuilder();421 void OnProcessDataReceivedWhileStarting(object sender, DataReceivedEventArgs e)422 {423 if (e.Data != null)424 {425 output.AppendLine(e.Data);426 var match = Regex.Match(e.Data, "^DevTools listening on (ws:\\/\\/.*)");427 if (match.Success)428 {429 p._startCompletionSource.SetResult(match.Groups[1].Value);430 }431 }432 }433 void OnProcessExitedWhileStarting(object sender, EventArgs e)434 {435 p._startCompletionSource.SetException(new ChromiumProcessException($"Failed to launch Chromium! {output}"));436 }437 void OnProcessExited(object sender, EventArgs e)438 {439 Exited.EnterFrom(p, p._currentState);440 }441 p.Process.ErrorDataReceived += OnProcessDataReceivedWhileStarting;442 p.Process.Exited += OnProcessExitedWhileStarting;443 p.Process.Exited += OnProcessExited;444 CancellationTokenSource cts = null;445 try446 {447 p.Process.Start();448 await Started.EnterFromAsync(p, this).ConfigureAwait(false);449 p.Process.BeginErrorReadLine();450 var timeout = p._options.Timeout;451 if (timeout > 0)452 {453 cts = new CancellationTokenSource(timeout);454 cts.Token.Register(() => p._startCompletionSource.TrySetException(455 new ChromiumProcessException($"Timed out after {timeout} ms while trying to connect to Chromium!")));456 }457 try458 {459 await p._startCompletionSource.Task.ConfigureAwait(false);460 await Started.EnterFromAsync(p, this).ConfigureAwait(false);461 }462 catch463 {464 await Killing.EnterFromAsync(p, this).ConfigureAwait(false);465 throw;466 }467 }468 finally469 {470 cts?.Dispose();471 p.Process.Exited -= OnProcessExitedWhileStarting;472 p.Process.ErrorDataReceived -= OnProcessDataReceivedWhileStarting;473 }474 }475 }476 private class StartedState : State477 {478 public Task EnterFromAsync(ChromiumProcess p, State fromState)479 {480 if (TryEnter(p, fromState))481 {482 // Process has not exited or been killed since transition to this state was initiated483 LogProcessCount(p, Interlocked.Increment(ref _processCount));484 }485 return Task.CompletedTask;486 }487 protected override void Leave(ChromiumProcess p)488 => LogProcessCount(p, Interlocked.Decrement(ref _processCount));489 public override Task StartAsync(ChromiumProcess p) => Task.CompletedTask;490 public override Task ExitAsync(ChromiumProcess p, TimeSpan timeout) => Exiting.EnterFromAsync(p, this, timeout);491 public override Task KillAsync(ChromiumProcess p) => Killing.EnterFromAsync(p, this);492 private static void LogProcessCount(ChromiumProcess p, int processCount)493 {494 try495 {496 p._logger?.LogInformation("Process Count: {ProcessCount}", processCount);497 }498 catch499 {500 // Prevent logging exception from causing havoc501 }502 }503 }504 private class ExitingState : State505 {506 public Task EnterFromAsync(ChromiumProcess p, State fromState, TimeSpan timeout)507 {508 return !TryEnter(p, fromState) ? p._currentState.ExitAsync(p, timeout) : ExitAsync(p, timeout);509 }510 public override async Task ExitAsync(ChromiumProcess p, TimeSpan timeout)511 {512 var timeoutTask = Task.Delay(timeout);513 var waitForExitTask = WaitForExitAsync(p);514 var completedTask = await Task.WhenAny(waitForExitTask, timeoutTask).ConfigureAwait(false);515 if (completedTask == timeoutTask)516 {517 await Killing.EnterFromAsync(p, this).ConfigureAwait(false);518 await waitForExitTask.ConfigureAwait(false);519 }520 }521 public override Task KillAsync(ChromiumProcess p) => Killing.EnterFromAsync(p, this);522 }523 private class KillingState : State524 {525 public Task EnterFromAsync(ChromiumProcess p, State fromState)526 {527 if (!TryEnter(p, fromState))528 {529 // Delegate KillAsync to current state, because it has already changed since530 // transition to this state was initiated.531 return p._currentState.KillAsync(p);532 }533 try534 {535 if (!p.Process.HasExited)536 {537 p.Process.Kill();538 }539 }...
LauncherBase.cs
Source:LauncherBase.cs
...311 #endregion312 #region Concrete state classes313 private class InitialState : State314 {315 public override Task StartAsync(LauncherBase p) => Starting.EnterFromAsync(p, this);316 public override Task ExitAsync(LauncherBase p, TimeSpan timeout)317 {318 Exited.EnterFrom(p, this);319 return Task.CompletedTask;320 }321 public override Task KillAsync(LauncherBase p)322 {323 Exited.EnterFrom(p, this);324 return Task.CompletedTask;325 }326 public override Task WaitForExitAsync(LauncherBase p) => Task.FromException(InvalidOperation("wait for exit"));327 }328 private class StartingState : State329 {330 public Task EnterFromAsync(LauncherBase p, State fromState)331 {332 if (!TryEnter(p, fromState))333 {334 // Delegate StartAsync to current state, because it has already changed since335 // transition to this state was initiated.336 return p._currentState.StartAsync(p);337 }338 return StartCoreAsync(p);339 }340 public override Task StartAsync(LauncherBase p) => p._startCompletionSource.Task;341 public override Task ExitAsync(LauncherBase p, TimeSpan timeout) => Exiting.EnterFromAsync(p, this, timeout);342 public override Task KillAsync(LauncherBase p) => Killing.EnterFromAsync(p, this);343 public override void Dispose(LauncherBase p)344 {345 p._startCompletionSource.TrySetException(new ObjectDisposedException(p.ToString()));346 base.Dispose(p);347 }348 private async Task StartCoreAsync(LauncherBase p)349 {350 var output = new StringBuilder();351 void OnProcessDataReceivedWhileStarting(object sender, DataReceivedEventArgs e)352 {353 if (e.Data != null)354 {355 output.AppendLine(e.Data);356 var match = Regex.Match(e.Data, "^DevTools listening on (ws:\\/\\/.*)");357 if (match.Success)358 {359 p._startCompletionSource.TrySetResult(match.Groups[1].Value);360 }361 }362 }363 void OnProcessExitedWhileStarting(object sender, EventArgs e)364 => p._startCompletionSource.TrySetException(new ProcessException($"Failed to launch Base! {output}"));365 void OnProcessExited(object sender, EventArgs e) => Exited.EnterFrom(p, p._currentState);366 p.Process.ErrorDataReceived += OnProcessDataReceivedWhileStarting;367 p.Process.Exited += OnProcessExitedWhileStarting;368 p.Process.Exited += OnProcessExited;369 CancellationTokenSource cts = null;370 try371 {372 p.Process.Start();373 await Started.EnterFromAsync(p, this).ConfigureAwait(false);374 p.Process.BeginErrorReadLine();375 int timeout = p._options.Timeout;376 if (timeout > 0)377 {378 cts = new CancellationTokenSource(timeout);379 cts.Token.Register(() => p._startCompletionSource.TrySetException(380 new ProcessException($"Timed out after {timeout} ms while trying to connect to Base!")));381 }382 try383 {384 await p._startCompletionSource.Task.ConfigureAwait(false);385 await Started.EnterFromAsync(p, this).ConfigureAwait(false);386 }387 catch388 {389 await Killing.EnterFromAsync(p, this).ConfigureAwait(false);390 throw;391 }392 }393 finally394 {395 cts?.Dispose();396 p.Process.Exited -= OnProcessExitedWhileStarting;397 p.Process.ErrorDataReceived -= OnProcessDataReceivedWhileStarting;398 }399 }400 }401 private class StartedState : State402 {403 public Task EnterFromAsync(LauncherBase p, State fromState)404 {405 if (TryEnter(p, fromState))406 {407 }408 return Task.CompletedTask;409 }410 protected override void Leave(LauncherBase p) { }411 public override Task StartAsync(LauncherBase p) => Task.CompletedTask;412 public override Task ExitAsync(LauncherBase p, TimeSpan timeout) => Exiting.EnterFromAsync(p, this, timeout);413 public override Task KillAsync(LauncherBase p) => Killing.EnterFromAsync(p, this);414 }415 private class ExitingState : State416 {417 public Task EnterFromAsync(LauncherBase p, State fromState, TimeSpan timeout)418 => !TryEnter(p, fromState) ? p._currentState.ExitAsync(p, timeout) : ExitAsync(p, timeout);419 public override async Task ExitAsync(LauncherBase p, TimeSpan timeout)420 {421 var waitForExitTask = WaitForExitAsync(p);422 await waitForExitTask.WithTimeout(423 async () =>424 {425 await Killing.EnterFromAsync(p, this).ConfigureAwait(false);426 await waitForExitTask.ConfigureAwait(false);427 },428 timeout,429 CancellationToken.None).ConfigureAwait(false);430 }431 public override Task KillAsync(LauncherBase p) => Killing.EnterFromAsync(p, this);432 }433 private class KillingState : State434 {435 public async Task EnterFromAsync(LauncherBase p, State fromState)436 {437 if (!TryEnter(p, fromState))438 {439 // Delegate KillAsync to current state, because it has already changed since440 // transition to this state was initiated.441 await p._currentState.KillAsync(p).ConfigureAwait(false);442 }443 try444 {445 if (!p.Process.HasExited)446 {447 p.Process.Kill();448 }449 }...
ExitingState.cs
Source:ExitingState.cs
...8 {9 public ExitingState(StateManager stateManager) : base(stateManager)10 {11 }12 public override Task EnterFromAsync(LauncherBase p, State fromState, TimeSpan timeout)13 => !StateManager.TryEnter(p, fromState, this) ? StateManager.CurrentState.ExitAsync(p, timeout) : ExitAsync(p, timeout);14 public override async Task ExitAsync(LauncherBase p, TimeSpan timeout)15 {16 var waitForExitTask = WaitForExitAsync(p);17 await waitForExitTask.WithTimeout(18 async () =>19 {20 await StateManager.Killing.EnterFromAsync(p, this, timeout).ConfigureAwait(false);21 await waitForExitTask.ConfigureAwait(false);22 },23 timeout,24 CancellationToken.None).ConfigureAwait(false);25 }26 public override Task KillAsync(LauncherBase p) => StateManager.Killing.EnterFromAsync(p, this);27 }28}...
StartedState.cs
Source:StartedState.cs
...6 {7 public StartedState(StateManager stateManager) : base(stateManager)8 {9 }10 public override Task EnterFromAsync(LauncherBase p, State fromState, TimeSpan timeout)11 {12 StateManager.TryEnter(p, fromState, this);13 return Task.CompletedTask;14 }15 public override Task StartAsync(LauncherBase p) => Task.CompletedTask;16 public override Task ExitAsync(LauncherBase p, TimeSpan timeout) => new ExitingState(StateManager).EnterFromAsync(p, this, timeout);17 public override Task KillAsync(LauncherBase p) => new KillingState(StateManager).EnterFromAsync(p, this);18 }19}...
EnterFromAsync
Using AI Code Generation
1var state = new PuppeteerSharp.States.ExitingState();2var page = new PuppeteerSharp.Page();3await state.EnterFromAsync(page);4var state = new PuppeteerSharp.States.ExitingState();5var page = new PuppeteerSharp.Page();6await state.EnterFromAsync(page);7var state = new PuppeteerSharp.States.ExitingState();8var page = new PuppeteerSharp.Page();9await state.EnterFromAsync(page);10var state = new PuppeteerSharp.States.ExitingState();11var page = new PuppeteerSharp.Page();12await state.EnterFromAsync(page);13var state = new PuppeteerSharp.States.ExitingState();14var page = new PuppeteerSharp.Page();15await state.EnterFromAsync(page);16var state = new PuppeteerSharp.States.ExitingState();17var page = new PuppeteerSharp.Page();18await state.EnterFromAsync(page);19var state = new PuppeteerSharp.States.ExitingState();20var page = new PuppeteerSharp.Page();21await state.EnterFromAsync(page);22var state = new PuppeteerSharp.States.ExitingState();23var page = new PuppeteerSharp.Page();24await state.EnterFromAsync(page);25var state = new PuppeteerSharp.States.ExitingState();26var page = new PuppeteerSharp.Page();27await state.EnterFromAsync(page);
EnterFromAsync
Using AI Code Generation
1await page.WaitForNavigationAsync(new NavigationOptions { WaitUntil = new[] { WaitUntilNavigation.Networkidle0 } });2await page.WaitForNavigationAsync(new NavigationOptions { WaitUntil = new[] { WaitUntilNavigation.Networkidle0 } });3await page.WaitForNavigationAsync(new NavigationOptions { WaitUntil = new[] { WaitUntilNavigation.Networkidle0 } });4await page.WaitForNavigationAsync(new NavigationOptions { WaitUntil = new[] { WaitUntilNavigation.Networkidle0 } });5await page.WaitForNavigationAsync(new NavigationOptions { WaitUntil = new[] { WaitUntilNavigation.Networkidle0 } });6await page.WaitForNavigationAsync(new NavigationOptions { WaitUntil = new[] { WaitUntilNavigation.Networkidle0 } });7await page.WaitForNavigationAsync(new NavigationOptions { WaitUntil = new[] { WaitUntilNavigation.Networkidle0 } });8await page.WaitForNavigationAsync(new NavigationOptions { WaitUntil = new[] { WaitUntilNavigation.Networkidle0 } });9await page.WaitForNavigationAsync(new NavigationOptions { WaitUntil = new[] { WaitUntilNavigation.Networkidle0 } });10await page.WaitForNavigationAsync(new NavigationOptions { WaitUntil = new[] { WaitUntilNavigation.Networkidle0 } });11await page.WaitForNavigationAsync(new NavigationOptions
EnterFromAsync
Using AI Code Generation
1await page.WaitForSelectorAsync("input[title='Search']");2await page.TypeAsync("input[title='Search']", "PuppeteerSharp");3await page.Keyboard.PressAsync("Enter");4await page.WaitForSelectorAsync("h3.LC20lb");5await page.ClickAsync("h3.LC20lb");6await page.WaitForSelectorAsync("input[title='Search']");7await page.ClickAsync("input[title='Search']");8await page.TypeAsync("input[title='Search']", "PuppeteerSharp");9await page.Keyboard.PressAsync("Enter");10await page.WaitForSelectorAsync("h3.LC20lb");11await page.ClickAsync("h3.LC20lb");12await page.WaitForSelectorAsync("input[title='Search']");13await page.ClickAsync("input[title='Search']");14await page.TypeAsync("input[title='Search']", "PuppeteerSharp");15await page.Keyboard.PressAsync("Enter");16await page.WaitForSelectorAsync("h3.LC20lb");17await page.ClickAsync("h3.LC20lb");18await page.WaitForSelectorAsync("input[title='Search']");19await page.ClickAsync("input[title='Search']");20await page.TypeAsync("input[title='Search']", "PuppeteerSharp");21await page.Keyboard.PressAsync("Enter");22await page.WaitForSelectorAsync("h3.LC20lb");23await page.ClickAsync("h3.LC20lb");24await page.WaitForSelectorAsync("input[title='Search']");25await page.ClickAsync("input[title='Search']");26await page.TypeAsync("input[title='Search']", "PuppeteerSharp");27await page.Keyboard.PressAsync("Enter");28await page.WaitForSelectorAsync("h3.LC20lb");29await page.ClickAsync("h3.LC20lb");30await page.WaitForSelectorAsync("input[title='Search']");31await page.ClickAsync("input[title='Search']");32await page.TypeAsync("input[title='Search']", "PuppeteerSharp");33await page.Keyboard.PressAsync("Enter");34await page.WaitForSelectorAsync("h3.LC20lb");35await page.ClickAsync("h3.LC20lb");36await page.WaitForSelectorAsync("input[title='Search']");37await page.ClickAsync("input[title='Search']");38await page.TypeAsync("input[title='Search']", "PuppeteerSharp");39await page.Keyboard.PressAsync("Enter");
EnterFromAsync
Using AI Code Generation
1var page = await browser.NewPageAsync();2await page.WaitForSelectorAsync("input[name='q']");3await page.ClickAsync("input[name='q']");4await page.Keyboard.TypeAsync("puppeteer-sharp");5await page.Keyboard.DownAsync("Enter");6await page.WaitForSelectorAsync("#result-stats");7var results = await page.QuerySelectorAllAsync("#result-stats");8var resultsCount = await results[0].EvaluateFunctionAsync<int>("element => element.textContent");9Console.WriteLine($"results count: {resultsCount}");10var page = await browser.NewPageAsync();11await page.WaitForSelectorAsync("input[name='q']");12await page.ClickAsync("input[name='q']");13await page.Keyboard.TypeAsync("puppeteer-sharp");14await page.Keyboard.DownAsync("Enter");15await page.WaitForSelectorAsync("#result-stats");16var results = await page.QuerySelectorAllAsync("#result-stats");17var resultsCount = await results[0].EvaluateFunctionAsync<int>("element => element.textContent");18Console.WriteLine($"results count: {resultsCount}");19var page = await browser.NewPageAsync();20await page.WaitForSelectorAsync("input[name='q']");21await page.ClickAsync("input[name='q']");22await page.Keyboard.TypeAsync("puppeteer-sharp");23await page.Keyboard.DownAsync("Enter");24await page.WaitForSelectorAsync("#result-stats");25var results = await page.QuerySelectorAllAsync("#result-stats");26var resultsCount = await results[0].EvaluateFunctionAsync<int>("element => element.textContent");27Console.WriteLine($"results count: {resultsCount}");28var page = await browser.NewPageAsync();29await page.WaitForSelectorAsync("input[name='q']");30await page.ClickAsync("input[name='q']");31await page.Keyboard.TypeAsync("puppeteer-sharp");32await page.Keyboard.DownAsync("Enter");33await page.WaitForSelectorAsync("#result-stats");34var results = await page.QuerySelectorAllAsync("#
EnterFromAsync
Using AI Code Generation
1var page = await browser.NewPageAsync();2await page.ClickAsync("input[name='q']");3await page.Keyboard.TypeAsync("Hello World");4await page.Keyboard.DownAsync("Enter");5await page.WaitForNavigationAsync();6var page = await browser.NewPageAsync();7await page.ClickAsync("input[name='q']");8await page.Keyboard.TypeAsync("Hello World");9await page.Keyboard.DownAsync("Enter");10await page.WaitForNavigationAsync();11var page = await browser.NewPageAsync();12await page.ClickAsync("input[name='q']");13await page.Keyboard.TypeAsync("Hello World");14await page.Keyboard.DownAsync("Enter");15await page.WaitForNavigationAsync();16var page = await browser.NewPageAsync();17await page.ClickAsync("input[name='q']");18await page.Keyboard.TypeAsync("Hello World");19await page.Keyboard.DownAsync("Enter");20await page.WaitForNavigationAsync();21var page = await browser.NewPageAsync();22await page.ClickAsync("input[name='q']");23await page.Keyboard.TypeAsync("Hello World");24await page.Keyboard.DownAsync("Enter");25await page.WaitForNavigationAsync();26var page = await browser.NewPageAsync();27await page.ClickAsync("input[name='q']");28await page.Keyboard.TypeAsync("Hello World");29await page.Keyboard.DownAsync("Enter");30await page.WaitForNavigationAsync();31var page = await browser.NewPageAsync();
EnterFromAsync
Using AI Code Generation
1using System;2using System.Threading.Tasks;3using PuppeteerSharp.States;4{5 {6 public static async Task EnterFromAsync(ExitingState exitingState, State from, State to, StateMachine stateMachine)7 {8 await stateMachine.EnterStateAsync(exitingState);9 }10 }11}12Name Description ExitingState() Initializes a new instance of the PuppeteerSharp.States.ExitingState class. Top13Name Description EnterFromAsync(State from, State to, StateMachine stateMachine) Enters this state from the specified state. Top
EnterFromAsync
Using AI Code Generation
1await page.GoBackAsync();2await page.GoForwardAsync();3await page.ReloadAsync();4await page.EvaluateExpressionAsync("1+1");5await page.EvaluateFunctionAsync("() => 1 + 2");6await page.EvaluateFunctionAsync("add", 1, 2);7await page.EvaluateFunctionHandleAsync("() => document.body");8await page.EvaluateFunctionHandleAsync("() => window");9await page.WaitForFunctionAsync("() => window.innerWidth < 100");10await page.WaitForSelectorAsync(".foo");11await page.QuerySelectorAsync("div");12await page.QuerySelectorAllAsync("div");13await page.GetContentAsync();14await page.GetTitleAsync();15await page.GetUrlAsync();16await page.GetCookiesAsync();17await page.GetCookiesAsync(new PuppeteerSharp.PageGetCookiesOptions());18await page.GetCookiesAsync(new PuppeteerSharp.PageGetCookiesOptions { Name = "foo" });19await page.SetCookieAsync(new PuppeteerSharp.NetworkCookieParam());20await page.SetCookieAsync(new PuppeteerSharp.NetworkCookieParam { Name = "foo" });21await page.DeleteCookieAsync(new PuppeteerSharp.NetworkCookieParam());22await page.DeleteCookieAsync(new PuppeteerSharp.NetworkCookieParam { Name = "foo" });23await page.DeleteCookieAsync(new PuppeteerSharp.NetworkCookie());24await page.DeleteCookieAsync(new PuppeteerSharp.NetworkCookie { Name = "foo" });25await page.DeleteCookieAsync(new PuppeteerSharp.NetworkCookie {
EnterFromAsync
Using AI Code Generation
1public async Task EnterFromAsync(ChromiumWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, int statusCode, string requestMethod, string url, bool isNavigation, bool isDownload, string referrer, string headers, Stream stream, bool isMainFrame, bool isRedirect, string origin)2{3}4public async Task ExitToAsync(ChromiumWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, int statusCode, string requestMethod, string url, bool isNavigation, bool isDownload, string referrer, string headers, Stream stream, bool isMainFrame, bool isRedirect, string origin)5{6}7public async Task EnterFromAsync(ChromiumWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, int statusCode, string requestMethod, string url, bool isNavigation, bool isDownload, string referrer, string headers, Stream stream, bool isMainFrame, bool isRedirect, string origin)8{9}10public async Task EnterFromAsync(ChromiumWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, int statusCode, string requestMethod, string url, bool isNavigation, bool isDownload, string referrer, string headers, Stream stream, bool isMainFrame, bool isRedirect, string origin)11{12}13public async Task ExitToAsync(ChromiumWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, int statusCode, string requestMethod, string url, bool isNavigation, bool isDownload, string referrer, string
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!!