Best Playwright-dotnet code snippet using Microsoft.Playwright.Core.Locator.ToString
Page.cs
Source:Page.cs  
...98            };99            _channel.Console += (_, e) => Console?.Invoke(this, e);100            _channel.DOMContentLoaded += (_, _) => DOMContentLoaded?.Invoke(this, this);101            _channel.Download += (_, e) => Download?.Invoke(this, new Download(this, e.Url, e.SuggestedFilename, e.Artifact.Object));102            _channel.PageError += (_, e) => PageError?.Invoke(this, e.ToString());103            _channel.Load += (_, _) => Load?.Invoke(this, this);104            _channel.Video += (_, e) => ForceVideo().ArtifactReady(e.Artifact);105            _channel.FileChooser += (_, e) => _fileChooserEventHandler?.Invoke(this, new FileChooser(this, e.Element.Object, e.IsMultiple));106            _channel.Worker += (_, e) =>107            {108                WorkersList.Add(e.WorkerChannel.Object);109                e.WorkerChannel.Object.Page = this;110                Worker?.Invoke(this, e.WorkerChannel.Object);111            };112            _defaultNavigationTimeout = Context.DefaultNavigationTimeout;113            _defaultTimeout = Context.DefaultTimeout;114            _initializer = initializer;115            Close += (_, _) => ClosedOrCrashedTcs.TrySetResult(true);116            Crash += (_, _) => ClosedOrCrashedTcs.TrySetResult(true);117        }118        public event EventHandler<IConsoleMessage> Console;119        public event EventHandler<IPage> Popup;120        public event EventHandler<IRequest> Request;121        public event EventHandler<IWebSocket> WebSocket;122        public event EventHandler<IResponse> Response;123        public event EventHandler<IRequest> RequestFinished;124        public event EventHandler<IRequest> RequestFailed;125        public event EventHandler<IDialog> Dialog;126        public event EventHandler<IFrame> FrameAttached;127        public event EventHandler<IFrame> FrameDetached;128        public event EventHandler<IFrame> FrameNavigated;129        public event EventHandler<IFileChooser> FileChooser130        {131            add132            {133                lock (_fileChooserEventLock)134                {135                    _fileChooserEventHandler += value;136                    _fileChooserIntercepted = true;137                    _channel.SetFileChooserInterceptedNoReplyAsync(true).IgnoreException();138                }139            }140            remove141            {142                lock (_fileChooserEventLock)143                {144                    _fileChooserEventHandler -= value;145                    if (_fileChooserIntercepted)146                    {147                        _fileChooserIntercepted = false;148                        _channel.SetFileChooserInterceptedNoReplyAsync(false).IgnoreException();149                    }150                }151            }152        }153        public event EventHandler<IPage> Load;154        public event EventHandler<IPage> DOMContentLoaded;155        public event EventHandler<IPage> Close;156        public event EventHandler<IPage> Crash;157        public event EventHandler<string> PageError;158        public event EventHandler<IWorker> Worker;159        public event EventHandler<IDownload> Download;160        ChannelBase IChannelOwner.Channel => _channel;161        IChannel<Page> IChannelOwner<Page>.Channel => _channel;162        public bool IsClosed { get; private set; }163        IFrame IPage.MainFrame => MainFrame;164        public Frame MainFrame { get; }165        IBrowserContext IPage.Context => Context;166        public BrowserContext Context { get; set; }167        public PageViewportSizeResult ViewportSize { get; private set; }168        public IAccessibility Accessibility169        {170            get => _accessibility;171            set => throw new NotSupportedException();172        }173        public IMouse Mouse174        {175            get => _mouse;176            set => throw new NotSupportedException();177        }178        public string Url => MainFrame.Url;179        public IReadOnlyList<IFrame> Frames => _frames.AsReadOnly();180        public IKeyboard Keyboard181        {182            get => _keyboard;183        }184        public ITouchscreen Touchscreen185        {186            get => _touchscreen;187        }188        public IReadOnlyList<IWorker> Workers => WorkersList;189        public IVideo Video190        {191            get192            {193                if (Context.Options.RecordVideoDir == null)194                {195                    return null;196                }197                return ForceVideo();198            }199            set => _video = value as Video;200        }201        internal BrowserContext OwnedContext { get; set; }202        internal Dictionary<string, Delegate> Bindings { get; } = new();203        internal List<Worker> WorkersList { get; } = new();204        internal Page Opener => _initializer.Opener;205        internal PageChannel Channel => _channel;206        internal float DefaultTimeout207        {208            get => _defaultTimeout;209            set210            {211                _defaultTimeout = value;212                _channel.SetDefaultTimeoutNoReplyAsync(value).IgnoreException();213            }214        }215        internal float DefaultNavigationTimeout216        {217            get => _defaultNavigationTimeout;218            set219            {220                _defaultNavigationTimeout = value;221                _channel.SetDefaultNavigationTimeoutNoReplyAsync(value).IgnoreException();222            }223        }224        internal TaskCompletionSource<bool> ClosedOrCrashedTcs { get; } = new();225        public IFrame Frame(string name)226            => Frames.FirstOrDefault(f => f.Name == name);227        public IFrame FrameByUrl(string urlString) => Frames.FirstOrDefault(f => Context.UrlMatches(urlString, f.Url));228        public IFrame FrameByUrl(Regex urlRegex) => Frames.FirstOrDefault(f => urlRegex.IsMatch(f.Url));229        public IFrame FrameByUrl(Func<string, bool> urlFunc) => Frames.FirstOrDefault(f => urlFunc(f.Url));230        IFrameLocator IPage.FrameLocator(string selector) => MainFrame.FrameLocator(selector);231        public Task<string> TitleAsync() => MainFrame.TitleAsync();232        public Task BringToFrontAsync() => _channel.BringToFrontAsync();233        public Task<IPage> OpenerAsync() => Task.FromResult<IPage>(Opener?.IsClosed == false ? Opener : null);234        public Task EmulateMediaAsync(PageEmulateMediaOptions options = default)235        {236            var args = new Dictionary<string, object>237            {238                ["media"] = options?.Media,239                ["colorScheme"] = options?.ColorScheme,240                ["reducedMotion"] = options?.ReducedMotion,241                ["forcedColors"] = options?.ForcedColors,242            };243            return _channel.EmulateMediaAsync(args);244        }245        public Task<IResponse> GotoAsync(string url, PageGotoOptions options = default)246            => MainFrame.GotoAsync(url, new() { WaitUntil = options?.WaitUntil, Timeout = options?.Timeout, Referer = options?.Referer });247        public Task WaitForURLAsync(string url, PageWaitForURLOptions options = default)248            => MainFrame.WaitForURLAsync(url, new() { WaitUntil = options?.WaitUntil, Timeout = options?.Timeout });249        public Task WaitForURLAsync(Regex url, PageWaitForURLOptions options = default)250            => MainFrame.WaitForURLAsync(url, new() { WaitUntil = options?.WaitUntil, Timeout = options?.Timeout });251        public Task WaitForURLAsync(Func<string, bool> url, PageWaitForURLOptions options = default)252            => MainFrame.WaitForURLAsync(url, new() { WaitUntil = options?.WaitUntil, Timeout = options?.Timeout });253        public Task<IConsoleMessage> WaitForConsoleMessageAsync(PageWaitForConsoleMessageOptions options = default)254            => InnerWaitForEventAsync(PageEvent.Console, null, options?.Predicate, options?.Timeout);255        public Task<IFileChooser> WaitForFileChooserAsync(PageWaitForFileChooserOptions options = default)256            => InnerWaitForEventAsync(PageEvent.FileChooser, null, options?.Predicate, options?.Timeout);257        public Task<IPage> WaitForPopupAsync(PageWaitForPopupOptions options = default)258            => InnerWaitForEventAsync(PageEvent.Popup, null, options?.Predicate, options?.Timeout);259        public Task<IWebSocket> WaitForWebSocketAsync(PageWaitForWebSocketOptions options = default)260            => InnerWaitForEventAsync(PageEvent.WebSocket, null, options?.Predicate, options?.Timeout);261        public Task<IWorker> WaitForWorkerAsync(PageWaitForWorkerOptions options = default)262            => InnerWaitForEventAsync(PageEvent.Worker, null, options?.Predicate, options?.Timeout);263        public Task<IResponse> WaitForNavigationAsync(PageWaitForNavigationOptions options = default)264            => MainFrame.WaitForNavigationAsync(new()265            {266                UrlString = options?.UrlString,267                UrlRegex = options?.UrlRegex,268                UrlFunc = options?.UrlFunc,269                WaitUntil = options?.WaitUntil,270                Timeout = options?.Timeout,271            });272        public Task<IResponse> RunAndWaitForNavigationAsync(Func<Task> action, PageRunAndWaitForNavigationOptions options = default)273            => MainFrame.RunAndWaitForNavigationAsync(action, new()274            {275                UrlString = options?.UrlString,276                UrlRegex = options?.UrlRegex,277                UrlFunc = options?.UrlFunc,278                WaitUntil = options?.WaitUntil,279                Timeout = options?.Timeout,280            });281        public Task<IRequest> WaitForRequestAsync(string urlOrPredicate, PageWaitForRequestOptions options = default)282            => InnerWaitForEventAsync(PageEvent.Request, null, e => Context.UrlMatches(e.Url, urlOrPredicate), options?.Timeout);283        public Task<IRequest> WaitForRequestAsync(Regex urlOrPredicate, PageWaitForRequestOptions options = default)284            => InnerWaitForEventAsync(PageEvent.Request, null, e => urlOrPredicate.IsMatch(e.Url), options?.Timeout);285        public Task<IRequest> WaitForRequestAsync(Func<IRequest, bool> urlOrPredicate, PageWaitForRequestOptions options = default)286            => InnerWaitForEventAsync(PageEvent.Request, null, e => urlOrPredicate(e), options?.Timeout);287        public Task<IRequest> WaitForRequestFinishedAsync(PageWaitForRequestFinishedOptions options = default)288            => InnerWaitForEventAsync(PageEvent.RequestFinished, null, options?.Predicate, options?.Timeout);289        public Task<IResponse> WaitForResponseAsync(string urlOrPredicate, PageWaitForResponseOptions options = default)290            => InnerWaitForEventAsync(PageEvent.Response, null, e => Context.UrlMatches(e.Url, urlOrPredicate), options?.Timeout);291        public Task<IResponse> WaitForResponseAsync(Regex urlOrPredicate, PageWaitForResponseOptions options = default)292            => InnerWaitForEventAsync(PageEvent.Response, null, e => urlOrPredicate.IsMatch(e.Url), options?.Timeout);293        public Task<IResponse> WaitForResponseAsync(Func<IResponse, bool> urlOrPredicate, PageWaitForResponseOptions options = default)294            => InnerWaitForEventAsync(PageEvent.Response, null, e => urlOrPredicate(e), options?.Timeout);295        public Task<IConsoleMessage> RunAndWaitForConsoleMessageAsync(Func<Task> action, PageRunAndWaitForConsoleMessageOptions options = default)296            => InnerWaitForEventAsync(PageEvent.Console, action, options?.Predicate, options?.Timeout);297        public Task<IDownload> WaitForDownloadAsync(PageWaitForDownloadOptions options = default)298            => InnerWaitForEventAsync(PageEvent.Download, null, options?.Predicate, options?.Timeout);299        public Task<IDownload> RunAndWaitForDownloadAsync(Func<Task> action, PageRunAndWaitForDownloadOptions options = default)300            => InnerWaitForEventAsync(PageEvent.Download, action, options?.Predicate, options?.Timeout);301        public Task<IFileChooser> RunAndWaitForFileChooserAsync(Func<Task> action, PageRunAndWaitForFileChooserOptions options = default)302            => InnerWaitForEventAsync(PageEvent.FileChooser, action, options?.Predicate, options?.Timeout);303        public Task<IPage> RunAndWaitForPopupAsync(Func<Task> action, PageRunAndWaitForPopupOptions options = default)304            => InnerWaitForEventAsync(PageEvent.Popup, action, options?.Predicate, options?.Timeout);305        public Task<IRequest> RunAndWaitForRequestFinishedAsync(Func<Task> action, PageRunAndWaitForRequestFinishedOptions options = default)306            => InnerWaitForEventAsync(PageEvent.RequestFinished, action, options?.Predicate, options?.Timeout);307        public Task<IWebSocket> RunAndWaitForWebSocketAsync(Func<Task> action, PageRunAndWaitForWebSocketOptions options = default)308            => InnerWaitForEventAsync(PageEvent.WebSocket, action, options?.Predicate, options?.Timeout);309        public Task<IWorker> RunAndWaitForWorkerAsync(Func<Task> action, PageRunAndWaitForWorkerOptions options = default)310            => InnerWaitForEventAsync(PageEvent.Worker, action, options?.Predicate, options?.Timeout);311        public Task<IRequest> RunAndWaitForRequestAsync(Func<Task> action, string urlOrPredicate, PageRunAndWaitForRequestOptions options = default)312            => InnerWaitForEventAsync(PageEvent.Request, action, e => Context.UrlMatches(e.Url, urlOrPredicate), options?.Timeout);313        public Task<IRequest> RunAndWaitForRequestAsync(Func<Task> action, Regex urlOrPredicate, PageRunAndWaitForRequestOptions options = default)314            => InnerWaitForEventAsync(PageEvent.Request, action, e => urlOrPredicate.IsMatch(e.Url), options?.Timeout);315        public Task<IRequest> RunAndWaitForRequestAsync(Func<Task> action, Func<IRequest, bool> urlOrPredicate, PageRunAndWaitForRequestOptions options = default)316            => InnerWaitForEventAsync(PageEvent.Request, action, e => urlOrPredicate(e), options?.Timeout);317        public Task<IResponse> RunAndWaitForResponseAsync(Func<Task> action, string urlOrPredicate, PageRunAndWaitForResponseOptions options = default)318            => InnerWaitForEventAsync(PageEvent.Response, action, e => Context.UrlMatches(e.Url, urlOrPredicate), options?.Timeout);319        public Task<IResponse> RunAndWaitForResponseAsync(Func<Task> action, Regex urlOrPredicate, PageRunAndWaitForResponseOptions options = default)320            => InnerWaitForEventAsync(PageEvent.Response, action, e => urlOrPredicate.IsMatch(e.Url), options?.Timeout);321        public Task<IResponse> RunAndWaitForResponseAsync(Func<Task> action, Func<IResponse, bool> urlOrPredicate, PageRunAndWaitForResponseOptions options = default)322            => InnerWaitForEventAsync(PageEvent.Response, action, e => urlOrPredicate(e), options?.Timeout);323        public Task<IJSHandle> WaitForFunctionAsync(string expression, object arg = default, PageWaitForFunctionOptions options = default)324            => MainFrame.WaitForFunctionAsync(expression, arg, new() { PollingInterval = options?.PollingInterval, Timeout = options?.Timeout });325        public async Task<T> InnerWaitForEventAsync<T>(PlaywrightEvent<T> pageEvent, Func<Task> action = default, Func<T, bool> predicate = default, float? timeout = default)326        {327            if (pageEvent == null)328            {329                throw new ArgumentException("Page event is required", nameof(pageEvent));330            }331            timeout ??= _defaultTimeout;332            using var waiter = new Waiter(this, $"page.WaitForEventAsync(\"{typeof(T)}\")");333            waiter.RejectOnTimeout(Convert.ToInt32(timeout), $"Timeout {timeout}ms exceeded while waiting for event \"{pageEvent.Name}\"");334            if (pageEvent.Name != PageEvent.Crash.Name)335            {336                waiter.RejectOnEvent<IPage>(this, PageEvent.Crash.Name, new("Page crashed"));337            }338            if (pageEvent.Name != PageEvent.Close.Name)339            {340                waiter.RejectOnEvent<IPage>(this, PageEvent.Close.Name, new("Page closed"));341            }342            var result = waiter.WaitForEventAsync(this, pageEvent.Name, predicate);343            if (action != null)344            {345                await WrapApiBoundaryAsync(() => Task.WhenAll(result, action())).ConfigureAwait(false);346            }347            return await result.ConfigureAwait(false);348        }349        public async Task CloseAsync(PageCloseOptions options = default)350        {351            try352            {353                await _channel.CloseAsync(options?.RunBeforeUnload ?? false).ConfigureAwait(false);354                if (OwnedContext != null)355                {356                    await OwnedContext.CloseAsync().ConfigureAwait(false);357                }358            }359            catch (Exception e) when (DriverMessages.IsSafeCloseError(e))360            {361                // Swallow exception362            }363        }364        public Task<T> EvaluateAsync<T>(string expression, object arg) => MainFrame.EvaluateAsync<T>(expression, arg);365        public Task<JsonElement?> EvalOnSelectorAsync(string selector, string expression, object arg) => MainFrame.EvalOnSelectorAsync(selector, expression, arg);366        public Task<T> EvalOnSelectorAsync<T>(string selector, string expression, object arg = null, PageEvalOnSelectorOptions options = null)367            => MainFrame.EvalOnSelectorAsync<T>(selector, expression, arg, new() { Strict = options?.Strict });368        public ILocator Locator(string selector, PageLocatorOptions options = default)369            => MainFrame.Locator(selector, new() { HasTextString = options?.HasTextString, HasTextRegex = options?.HasTextRegex, Has = options?.Has });370        public Task<IElementHandle> QuerySelectorAsync(string selector, PageQuerySelectorOptions options = null)371            => MainFrame.QuerySelectorAsync(selector, new() { Strict = options?.Strict });372        public Task<T> EvalOnSelectorAsync<T>(string selector, string expression, object arg) => MainFrame.EvalOnSelectorAsync<T>(selector, expression, arg);373        public Task<JsonElement?> EvalOnSelectorAllAsync(string selector, string expression, object arg) => MainFrame.EvalOnSelectorAllAsync(selector, expression, arg);374        public Task<T> EvalOnSelectorAllAsync<T>(string selector, string expression, object arg) => MainFrame.EvalOnSelectorAllAsync<T>(selector, expression, arg);375        public Task FillAsync(string selector, string value, PageFillOptions options = default)376            => MainFrame.FillAsync(selector, value, new() { NoWaitAfter = options?.NoWaitAfter, Timeout = options?.Timeout, Force = options?.Force, Strict = options?.Strict });377        public Task SetInputFilesAsync(string selector, string files, PageSetInputFilesOptions options = default)378            => MainFrame.SetInputFilesAsync(selector, files, Map(options));379        public Task SetInputFilesAsync(string selector, IEnumerable<string> files, PageSetInputFilesOptions options = default)380            => MainFrame.SetInputFilesAsync(selector, files, Map(options));381        public Task SetInputFilesAsync(string selector, FilePayload files, PageSetInputFilesOptions options = default)382            => MainFrame.SetInputFilesAsync(selector, files, Map(options));383        public Task SetInputFilesAsync(string selector, IEnumerable<FilePayload> files, PageSetInputFilesOptions options = default)384            => MainFrame.SetInputFilesAsync(selector, files, Map(options));385        public Task TypeAsync(string selector, string text, PageTypeOptions options = default)386            => MainFrame.TypeAsync(selector, text, new()387            {388                Delay = options?.Delay,389                NoWaitAfter = options?.NoWaitAfter,390                Timeout = options?.Timeout,391                Strict = options?.Strict,392            });393        public Task FocusAsync(string selector, PageFocusOptions options = default)394            => MainFrame.FocusAsync(selector, new()395            {396                Timeout = options?.Timeout,397                Strict = options?.Strict,398            });399        public Task HoverAsync(string selector, PageHoverOptions options = default)400            => MainFrame.HoverAsync(401                selector,402                new()403                {404                    Position = options?.Position,405                    Modifiers = options?.Modifiers,406                    Force = options?.Force,407                    Timeout = options?.Timeout,408                    Trial = options?.Trial,409                    Strict = options?.Strict,410                });411        public Task PressAsync(string selector, string key, PagePressOptions options = default)412            => MainFrame.PressAsync(selector, key, new()413            {414                Delay = options?.Delay,415                NoWaitAfter = options?.NoWaitAfter,416                Timeout = options?.Timeout,417                Strict = options?.Strict,418            });419        public Task<IReadOnlyList<string>> SelectOptionAsync(string selector, string values, PageSelectOptionOptions options = default)420            => SelectOptionAsync(selector, new[] { values }, options);421        public Task<IReadOnlyList<string>> SelectOptionAsync(string selector, IEnumerable<string> values, PageSelectOptionOptions options = default)422            => SelectOptionAsync(selector, values.Select(x => new SelectOptionValue() { Value = x }), options);423        public Task<IReadOnlyList<string>> SelectOptionAsync(string selector, IElementHandle values, PageSelectOptionOptions options = default)424            => SelectOptionAsync(selector, new[] { values }, options);425        public Task<IReadOnlyList<string>> SelectOptionAsync(string selector, IEnumerable<IElementHandle> values, PageSelectOptionOptions options = default)426            => MainFrame.SelectOptionAsync(selector, values, new()427            {428                NoWaitAfter = options?.NoWaitAfter,429                Timeout = options?.Timeout,430                Force = options?.Force,431                Strict = options?.Strict,432            });433        public Task<IReadOnlyList<string>> SelectOptionAsync(string selector, SelectOptionValue values, PageSelectOptionOptions options = default)434            => SelectOptionAsync(selector, new[] { values }, options);435        public Task<IReadOnlyList<string>> SelectOptionAsync(string selector, IEnumerable<SelectOptionValue> values, PageSelectOptionOptions options = default)436            => MainFrame.SelectOptionAsync(selector, values, new()437            {438                NoWaitAfter = options?.NoWaitAfter,439                Timeout = options?.Timeout,440                Force = options?.Force,441                Strict = options?.Strict,442            });443        public Task WaitForTimeoutAsync(float timeout) => MainFrame.WaitForTimeoutAsync(timeout);444        public Task<IElementHandle> WaitForSelectorAsync(string selector, PageWaitForSelectorOptions options = default)445            => MainFrame.WaitForSelectorAsync(selector, new()446            {447                State = options?.State,448                Timeout = options?.Timeout,449                Strict = options?.Strict,450            });451        public Task<JsonElement?> EvaluateAsync(string expression, object arg) => MainFrame.EvaluateAsync(expression, arg);452        public async Task<byte[]> ScreenshotAsync(PageScreenshotOptions options = default)453        {454            options ??= new PageScreenshotOptions();455            if (options.Type == null && !string.IsNullOrEmpty(options.Path))456            {457                options.Type = ElementHandle.DetermineScreenshotType(options.Path);458            }459            byte[] result = await _channel.ScreenshotAsync(460                path: options.Path,461                fullPage: options.FullPage,462                clip: options.Clip,463                omitBackground: options.OmitBackground,464                type: options.Type,465                quality: options.Quality,466                mask: options.Mask,467                animations: options.Animations,468                caret: options.Caret,469                scale: options.Scale,470                timeout: options.Timeout).ConfigureAwait(false);471            if (!string.IsNullOrEmpty(options.Path))472            {473                Directory.CreateDirectory(new FileInfo(options.Path).Directory.FullName);474                File.WriteAllBytes(options.Path, result);475            }476            return result;477        }478        public Task SetContentAsync(string html, PageSetContentOptions options = default)479            => MainFrame.SetContentAsync(html, new() { WaitUntil = options?.WaitUntil, Timeout = options?.Timeout });480        public Task<string> ContentAsync() => MainFrame.ContentAsync();481        public Task SetExtraHTTPHeadersAsync(IEnumerable<KeyValuePair<string, string>> headers)482            => _channel.SetExtraHTTPHeadersAsync(headers);483        public Task<IElementHandle> QuerySelectorAsync(string selector) => MainFrame.QuerySelectorAsync(selector);484        public Task<IReadOnlyList<IElementHandle>> QuerySelectorAllAsync(string selector)485            => MainFrame.QuerySelectorAllAsync(selector);486        public Task<IJSHandle> EvaluateHandleAsync(string expression, object arg) => MainFrame.EvaluateHandleAsync(expression, arg);487        public Task<IElementHandle> AddScriptTagAsync(PageAddScriptTagOptions options = default)488            => MainFrame.AddScriptTagAsync(new()489            {490                Url = options?.Url,491                Path = options?.Path,492                Content = options?.Content,493                Type = options?.Type,494            });495        public Task<IElementHandle> AddStyleTagAsync(PageAddStyleTagOptions options = default)496            => MainFrame.AddStyleTagAsync(new()497            {498                Url = options?.Url,499                Path = options?.Path,500                Content = options?.Content,501            });502        public Task ClickAsync(string selector, PageClickOptions options = default)503            => MainFrame.ClickAsync(504                selector,505                new()506                {507                    Button = options?.Button,508                    ClickCount = options?.ClickCount,509                    Delay = options?.Delay,510                    Position = options?.Position,511                    Modifiers = options?.Modifiers,512                    Force = options?.Force,513                    NoWaitAfter = options?.NoWaitAfter,514                    Timeout = options?.Timeout,515                    Trial = options?.Trial,516                    Strict = options?.Strict,517                });518        public Task DblClickAsync(string selector, PageDblClickOptions options = default)519            => MainFrame.DblClickAsync(selector, new()520            {521                Delay = options?.Delay,522                Button = options?.Button,523                Position = options?.Position,524                Modifiers = options?.Modifiers,525                Timeout = options?.Timeout,526                Force = options?.Force,527                NoWaitAfter = options?.NoWaitAfter,528                Trial = options?.Trial,529                Strict = options?.Strict,530            });531        public async Task<IResponse> GoBackAsync(PageGoBackOptions options = default)532            => (await _channel.GoBackAsync(options?.Timeout, options?.WaitUntil).ConfigureAwait(false))?.Object;533        public async Task<IResponse> GoForwardAsync(PageGoForwardOptions options = default)534            => (await _channel.GoForwardAsync(options?.Timeout, options?.WaitUntil).ConfigureAwait(false))?.Object;535        public async Task<IResponse> ReloadAsync(PageReloadOptions options = default)536            => (await _channel.ReloadAsync(options?.Timeout, options?.WaitUntil).ConfigureAwait(false))?.Object;537        public Task ExposeBindingAsync(string name, Action callback, PageExposeBindingOptions options = default)538            => InnerExposeBindingAsync(name, (Delegate)callback, options?.Handle ?? false);539        public Task ExposeBindingAsync(string name, Action<BindingSource> callback)540            => InnerExposeBindingAsync(name, (Delegate)callback);541        public Task ExposeBindingAsync<T>(string name, Action<BindingSource, T> callback)542            => InnerExposeBindingAsync(name, (Delegate)callback);543        public Task ExposeBindingAsync<TResult>(string name, Func<BindingSource, TResult> callback)544            => InnerExposeBindingAsync(name, (Delegate)callback);545        public Task ExposeBindingAsync<TResult>(string name, Func<BindingSource, IJSHandle, TResult> callback)546            => InnerExposeBindingAsync(name, (Delegate)callback, true);547        public Task ExposeBindingAsync<T, TResult>(string name, Func<BindingSource, T, TResult> callback)548            => InnerExposeBindingAsync(name, (Delegate)callback);549        public Task ExposeBindingAsync<T1, T2, TResult>(string name, Func<BindingSource, T1, T2, TResult> callback)550            => InnerExposeBindingAsync(name, (Delegate)callback);551        public Task ExposeBindingAsync<T1, T2, T3, TResult>(string name, Func<BindingSource, T1, T2, T3, TResult> callback)552            => InnerExposeBindingAsync(name, (Delegate)callback);553        public Task ExposeBindingAsync<T1, T2, T3, T4, TResult>(string name, Func<BindingSource, T1, T2, T3, T4, TResult> callback)554            => InnerExposeBindingAsync(name, (Delegate)callback);555        public Task ExposeFunctionAsync(string name, Action callback)556            => ExposeBindingAsync(name, (BindingSource _) => callback());557        public Task ExposeFunctionAsync<T>(string name, Action<T> callback)558            => ExposeBindingAsync(name, (BindingSource _, T t) => callback(t));559        public Task ExposeFunctionAsync<TResult>(string name, Func<TResult> callback)560            => ExposeBindingAsync(name, (BindingSource _) => callback());561        public Task ExposeFunctionAsync<T, TResult>(string name, Func<T, TResult> callback)562            => ExposeBindingAsync(name, (BindingSource _, T t) => callback(t));563        public Task ExposeFunctionAsync<T1, T2, TResult>(string name, Func<T1, T2, TResult> callback)564            => ExposeBindingAsync(name, (BindingSource _, T1 t1, T2 t2) => callback(t1, t2));565        public Task ExposeFunctionAsync<T1, T2, T3, TResult>(string name, Func<T1, T2, T3, TResult> callback)566            => ExposeBindingAsync(name, (BindingSource _, T1 t1, T2 t2, T3 t3) => callback(t1, t2, t3));567        public Task ExposeFunctionAsync<T1, T2, T3, T4, TResult>(string name, Func<T1, T2, T3, T4, TResult> callback)568            => ExposeBindingAsync(name, (BindingSource _, T1 t1, T2 t2, T3 t3, T4 t4) => callback(t1, t2, t3, t4));569        public async Task<byte[]> PdfAsync(PagePdfOptions options = default)570        {571            if (!Context.IsChromium)572            {573                throw new NotSupportedException("This browser doesn't support this action.");574            }575            byte[] result = await _channel.PdfAsync(576                scale: options?.Scale,577                displayHeaderFooter: options?.DisplayHeaderFooter,578                headerTemplate: options?.HeaderTemplate,579                footerTemplate: options?.FooterTemplate,580                printBackground: options?.PrintBackground,581                landscape: options?.Landscape,582                pageRanges: options?.PageRanges,583                format: options?.Format,584                width: options?.Width,585                height: options?.Height,586                margin: options?.Margin,587                preferCSSPageSize: options?.PreferCSSPageSize).ConfigureAwait(false);588            if (!string.IsNullOrEmpty(options?.Path))589            {590                Directory.CreateDirectory(new FileInfo(options.Path).Directory.FullName);591                File.WriteAllBytes(options.Path, result);592            }593            return result;594        }595        public Task AddInitScriptAsync(string script, string scriptPath)596            => _channel.AddInitScriptAsync(ScriptsHelper.EvaluationScript(script, scriptPath));597        public Task RouteAsync(string url, Action<IRoute> handler, PageRouteOptions options = null)598            => RouteAsync(new Regex(Context.CombineUrlWithBase(url).GlobToRegex()), null, handler, options);599        public Task RouteAsync(Regex url, Action<IRoute> handler, PageRouteOptions options = null)600             => RouteAsync(url, null, handler, options);601        public Task RouteAsync(Func<string, bool> url, Action<IRoute> handler, PageRouteOptions options = null)602            => RouteAsync(null, url, handler, options);603        public Task UnrouteAsync(string urlString, Action<IRoute> handler)604            => UnrouteAsync(new Regex(Context.CombineUrlWithBase(urlString).GlobToRegex()), null, handler);605        public Task UnrouteAsync(Regex urlString, Action<IRoute> handler)606            => UnrouteAsync(urlString, null, handler);607        public Task UnrouteAsync(Func<string, bool> urlFunc, Action<IRoute> handler)608            => UnrouteAsync(null, urlFunc, handler);609        public Task WaitForLoadStateAsync(LoadState? state = default, PageWaitForLoadStateOptions options = default)610            => MainFrame.WaitForLoadStateAsync(state, new() { Timeout = options?.Timeout });611        public Task SetViewportSizeAsync(int width, int height)612        {613            ViewportSize = new() { Width = width, Height = height };614            return _channel.SetViewportSizeAsync(ViewportSize);615        }616        public Task SetCheckedAsync(string selector, bool checkedState, PageSetCheckedOptions options = null)617            => checkedState ?618            MainFrame.CheckAsync(selector, new()619            {620                Position = options?.Position,621                Force = options?.Force,622                NoWaitAfter = options?.NoWaitAfter,623                Strict = options?.Strict,624                Timeout = options?.Timeout,625                Trial = options?.Trial,626            })627            : MainFrame.UncheckAsync(selector, new()628            {629                Position = options?.Position,630                Force = options?.Force,631                NoWaitAfter = options?.NoWaitAfter,632                Timeout = options?.Timeout,633                Trial = options?.Trial,634                Strict = options?.Strict,635            });636        public Task CheckAsync(string selector, PageCheckOptions options = default)637            => MainFrame.CheckAsync(selector, new()638            {639                Position = options?.Position,640                Force = options?.Force,641                NoWaitAfter = options?.NoWaitAfter,642                Strict = options?.Strict,643                Timeout = options?.Timeout,644                Trial = options?.Trial,645            });646        public Task UncheckAsync(string selector, PageUncheckOptions options = default)647            => MainFrame.UncheckAsync(selector, new()648            {649                Position = options?.Position,650                Force = options?.Force,651                NoWaitAfter = options?.NoWaitAfter,652                Timeout = options?.Timeout,653                Trial = options?.Trial,654                Strict = options?.Strict,655            });656        public Task DispatchEventAsync(string selector, string type, object eventInit = default, PageDispatchEventOptions options = default)657             => MainFrame.DispatchEventAsync(selector, type, eventInit, new() { Timeout = options?.Timeout, Strict = options?.Strict });658        public Task<string> GetAttributeAsync(string selector, string name, PageGetAttributeOptions options = default)659             => MainFrame.GetAttributeAsync(selector, name, new()660             {661                 Timeout = options?.Timeout,662                 Strict = options?.Strict,663             });664        public Task<string> InnerHTMLAsync(string selector, PageInnerHTMLOptions options = default)665             => MainFrame.InnerHTMLAsync(selector, new()666             {667                 Timeout = options?.Timeout,668                 Strict = options?.Strict,669             });670        public Task<string> InnerTextAsync(string selector, PageInnerTextOptions options = default)671             => MainFrame.InnerTextAsync(selector, new()672             {673                 Timeout = options?.Timeout,674                 Strict = options?.Strict,675             });676        public Task<string> TextContentAsync(string selector, PageTextContentOptions options = default)677             => MainFrame.TextContentAsync(selector, new()678             {679                 Timeout = options?.Timeout,680                 Strict = options?.Strict,681             });682        public Task TapAsync(string selector, PageTapOptions options = default)683            => MainFrame.TapAsync(684                selector,685                new()686                {687                    Modifiers = options?.Modifiers,688                    Position = options?.Position,689                    Force = options?.Force,690                    NoWaitAfter = options?.NoWaitAfter,691                    Timeout = options?.Timeout,692                    Trial = options?.Trial,693                    Strict = options?.Strict,694                });695        public Task<bool> IsCheckedAsync(string selector, PageIsCheckedOptions options = default)696            => MainFrame.IsCheckedAsync(selector, new()697            {698                Timeout = options?.Timeout,699                Strict = options?.Strict,700            });701        public Task<bool> IsDisabledAsync(string selector, PageIsDisabledOptions options = default)702            => MainFrame.IsDisabledAsync(selector, new()703            {704                Timeout = options?.Timeout,705                Strict = options?.Strict,706            });707        public Task<bool> IsEditableAsync(string selector, PageIsEditableOptions options = default)708            => MainFrame.IsEditableAsync(selector, new()709            {710                Timeout = options?.Timeout,711                Strict = options?.Strict,712            });713        public Task<bool> IsEnabledAsync(string selector, PageIsEnabledOptions options = default)714            => MainFrame.IsEnabledAsync(selector, new()715            {716                Timeout = options?.Timeout,717                Strict = options?.Strict,718            });719#pragma warning disable CS0612 // Type or member is obsolete720        public Task<bool> IsHiddenAsync(string selector, PageIsHiddenOptions options = default)721            => MainFrame.IsHiddenAsync(selector, new()722            {723                Timeout = options?.Timeout,724                Strict = options?.Strict,725            });726        public Task<bool> IsVisibleAsync(string selector, PageIsVisibleOptions options = default)727            => MainFrame.IsVisibleAsync(selector, new()728            {729                Timeout = options?.Timeout,730                Strict = options?.Strict,731            });732#pragma warning restore CS0612 // Type or member is obsolete733        public Task PauseAsync() => Context.Channel.PauseAsync();734        public void SetDefaultNavigationTimeout(float timeout) => DefaultNavigationTimeout = timeout;735        public void SetDefaultTimeout(float timeout) => DefaultTimeout = timeout;736        public Task<string> InputValueAsync(string selector, PageInputValueOptions options = null)737            => MainFrame.InputValueAsync(selector, new()738            {739                Timeout = options?.Timeout,740                Strict = options?.Strict,741            });742        public Task DragAndDropAsync(string source, string target, PageDragAndDropOptions options = null)743            => MainFrame.DragAndDropAsync(source, target, new()744            {745                Force = options?.Force,746                NoWaitAfter = options?.NoWaitAfter,747                Timeout = options?.Timeout,748                Trial = options?.Trial,749                Strict = options?.Strict,750            });751        internal void NotifyPopup(Page page) => Popup?.Invoke(this, page);752        internal void OnFrameNavigated(Frame frame)753            => FrameNavigated?.Invoke(this, frame);754        internal void FireRequest(IRequest request) => Request?.Invoke(this, request);755        internal void FireRequestFailed(IRequest request) => RequestFailed?.Invoke(this, request);756        internal void FireRequestFinished(IRequest request) => RequestFinished?.Invoke(this, request);757        internal void FireResponse(IResponse response) => Response?.Invoke(this, response);758        private Task RouteAsync(Regex urlRegex, Func<string, bool> urlFunc, Action<IRoute> handler, PageRouteOptions options)759            => RouteAsync(new()760            {761                Regex = urlRegex,762                Function = urlFunc,763                Handler = handler,764                Times = options?.Times,765            });766        private Task RouteAsync(RouteSetting setting)767        {768            _routes.Insert(0, setting);769            if (_routes.Count == 1)770            {771                return _channel.SetNetworkInterceptionEnabledAsync(true);772            }773            return Task.CompletedTask;774        }775        private Task UnrouteAsync(Regex urlRegex, Func<string, bool> urlFunc, Action<IRoute> handler = null)776            => UnrouteAsync(new()777            {778                Function = urlFunc,779                Regex = urlRegex,780                Handler = handler,781            });782        private Task UnrouteAsync(RouteSetting setting)783        {784            var newRoutesList = new List<RouteSetting>();785            newRoutesList.AddRange(_routes.Where(r =>786                (setting.Regex != null && !(r.Regex == setting.Regex || (r.Regex.ToString() == setting.Regex.ToString() && r.Regex.Options == setting.Regex.Options))) ||787                (setting.Function != null && r.Function != setting.Function) ||788                (setting.Handler != null && r.Handler != setting.Handler)));789            _routes = newRoutesList;790            if (_routes.Count == 0)791            {792                return DisableInterceptionAsync();793            }794            return Task.CompletedTask;795        }796        internal void OnClose()797        {798            IsClosed = true;799            Context?.PagesList.Remove(this);800            RejectPendingOperations(false);...ElementHandleChannel.cs
Source:ElementHandleChannel.cs  
...44        {45            switch (method)46            {47                case "previewUpdated":48                    PreviewUpdated?.Invoke(this, new() { Preview = serverParams.Value.GetProperty("preview").ToString() });49                    break;50            }51        }52        internal Task<ElementHandleChannel> WaitForSelectorAsync(string selector, WaitForSelectorState? state, float? timeout, bool? strict)53        {54            var args = new Dictionary<string, object>55            {56                ["selector"] = selector,57                ["timeout"] = timeout,58                ["state"] = state,59                ["strict"] = strict,60            };61            return Connection.SendMessageToServerAsync<ElementHandleChannel>(62                Guid,63                "waitForSelector",64                args);65        }66        internal Task<ElementHandleChannel> QuerySelectorAsync(string selector)67            => Connection.SendMessageToServerAsync<ElementHandleChannel>(68                Guid,69                "querySelector",70                new Dictionary<string, object>71                {72                    ["selector"] = selector,73                });74        internal Task WaitForElementStateAsync(ElementState state, float? timeout)75        {76            var args = new Dictionary<string, object>77            {78                ["state"] = state,79                ["timeout"] = timeout,80            };81            return Connection.SendMessageToServerAsync<ElementHandleChannel>(Guid, "waitForElementState", args);82        }83        internal Task<ChannelBase[]> QuerySelectorAllAsync(string selector)84            => Connection.SendMessageToServerAsync<ChannelBase[]>(85                Guid,86                "querySelectorAll",87                new Dictionary<string, object>88                {89                    ["selector"] = selector,90                });91        internal async Task<byte[]> ScreenshotAsync(string path, bool? omitBackground, ScreenshotType? type, int? quality, IEnumerable<ILocator> mask, ScreenshotAnimations? animations, ScreenshotCaret? caret, ScreenshotScale? scale, float? timeout)92        {93            var args = new Dictionary<string, object>94            {95                ["type"] = type,96                ["omitBackground"] = omitBackground,97                ["path"] = path,98                ["timeout"] = timeout,99                ["animations"] = animations,100                ["caret"] = caret,101                ["scale"] = scale,102                ["quality"] = quality,103            };104            if (mask != null)105            {106                args["mask"] = mask.Select(locator => new Dictionary<string, object>107                {108                    ["frame"] = ((Locator)locator)._frame._channel,109                    ["selector"] = ((Locator)locator)._selector,110                }).ToArray();111            }112            return (await Connection.SendMessageToServerAsync(Guid, "screenshot", args).ConfigureAwait(false))?.GetProperty("binary").GetBytesFromBase64();113        }114        internal Task<JsonElement?> EvalOnSelectorAsync(string selector, string script, object arg)115            => Connection.SendMessageToServerAsync<JsonElement?>(116                Guid,117                "evalOnSelector",118                new Dictionary<string, object>119                {120                    ["selector"] = selector,121                    ["expression"] = script,122                    ["arg"] = arg,123                });124        internal Task<JsonElement?> EvalOnSelectorAllAsync(string selector, string script, object arg)125            => Connection.SendMessageToServerAsync<JsonElement?>(126                Guid,127                "evalOnSelectorAll",128                new Dictionary<string, object>129                {130                    ["selector"] = selector,131                    ["expression"] = script,132                    ["arg"] = arg,133                });134        internal Task<FrameChannel> ContentFrameAsync() => Connection.SendMessageToServerAsync<FrameChannel>(Guid, "contentFrame", null);135        internal Task<FrameChannel> OwnerFrameAsync() => Connection.SendMessageToServerAsync<FrameChannel>(Guid, "ownerFrame", null);136        internal Task HoverAsync(137            IEnumerable<KeyboardModifier> modifiers,138            Position position,139            float? timeout,140            bool? force,141            bool? trial)142        {143            var args = new Dictionary<string, object>144            {145                ["force"] = force,146                ["position"] = position,147                ["timeout"] = timeout,148                ["trial"] = trial,149                ["modifiers"] = modifiers?.Select(m => m.ToValueString()),150            };151            return Connection.SendMessageToServerAsync<JsonElement?>(Guid, "hover", args);152        }153        internal Task FocusAsync() => Connection.SendMessageToServerAsync(Guid, "focus", null);154        internal Task ClickAsync(155            float? delay,156            MouseButton? button,157            int? clickCount,158            IEnumerable<KeyboardModifier> modifiers,159            Position position,160            float? timeout,161            bool? force,162            bool? noWaitAfter,163            bool? trial)164        {165            var args = new Dictionary<string, object>166            {167                ["delay"] = delay,168                ["button"] = button,169                ["clickCount"] = clickCount,170                ["force"] = force,171                ["noWaitAfter"] = noWaitAfter,172                ["timeout"] = timeout,173                ["trial"] = trial,174                ["position"] = position,175                ["modifiers"] = modifiers?.Select(m => m.ToValueString()),176            };177            return Connection.SendMessageToServerAsync(Guid, "click", args);178        }179        internal Task DblClickAsync(180            float? delay,181            MouseButton? button,182            IEnumerable<KeyboardModifier> modifiers,183            Position position,184            float? timeout,185            bool? force,186            bool? noWaitAfter,187            bool? trial)188        {189            var args = new Dictionary<string, object>190            {191                ["delay"] = delay,192                ["button"] = button,193                ["force"] = force,194                ["noWaitAfter"] = noWaitAfter,195                ["timeout"] = timeout,196                ["trial"] = trial,197                ["position"] = position,198                ["modifiers"] = modifiers?.Select(m => m.ToValueString()),199            };200            return Connection.SendMessageToServerAsync(Guid, "dblclick", args);201        }202        internal async Task<ElementHandleBoundingBoxResult> BoundingBoxAsync()203        {204            var result = (await Connection.SendMessageToServerAsync(Guid, "boundingBox", null).ConfigureAwait(false)).Value;205            if (result.TryGetProperty("value", out var value))206            {207                return value.ToObject<ElementHandleBoundingBoxResult>();208            }209            return null;210        }211        internal Task ScrollIntoViewIfNeededAsync(float? timeout)212        {213            var args = new Dictionary<string, object>214            {215                ["timeout"] = timeout,216            };217            return Connection.SendMessageToServerAsync<ElementHandleChannel>(Guid, "scrollIntoViewIfNeeded", args);218        }219        internal Task FillAsync(string value, bool? noWaitAfter, bool? force, float? timeout)220        {221            var args = new Dictionary<string, object>222            {223                ["value"] = value,224                ["timeout"] = timeout,225                ["force"] = force,226                ["noWaitAfter"] = noWaitAfter,227            };228            return Connection.SendMessageToServerAsync(Guid, "fill", args);229        }230        internal Task DispatchEventAsync(string type, object eventInit)231        {232            var args = new Dictionary<string, object>233            {234                ["type"] = type,235                ["eventInit"] = eventInit,236            };237            return Connection.SendMessageToServerAsync<ElementHandleChannel>(Guid, "dispatchEvent", args);238        }239        internal Task SetInputFilesAsync(IEnumerable<InputFilesList> files, bool? noWaitAfter, float? timeout)240        {241            var args = new Dictionary<string, object>242            {243                ["files"] = files,244                ["timeout"] = timeout,245                ["noWaitAfter"] = noWaitAfter,246            };247            return Connection.SendMessageToServerAsync(Guid, "setInputFiles", args);248        }249        internal Task SetInputFilePathsAsync(IEnumerable<string> localPaths, IEnumerable<WritableStream> streams, bool? noWaitAfter, float? timeout)250        {251            var args = new Dictionary<string, object>252            {253                ["localPaths"] = localPaths,254                ["streams"] = streams,255                ["timeout"] = timeout,256                ["noWaitAfter"] = noWaitAfter,257            };258            return Connection.SendMessageToServerAsync(Guid, "setInputFilePaths", args);259        }260        internal async Task<string> GetAttributeAsync(string name)261        {262            var args = new Dictionary<string, object>263            {264                ["name"] = name,265            };266            return (await Connection.SendMessageToServerAsync(Guid, "getAttribute", args).ConfigureAwait(false))?.GetProperty("value").ToString();267        }268        internal async Task<string> InnerHTMLAsync()269            => (await Connection.SendMessageToServerAsync(Guid, "innerHTML").ConfigureAwait(false))?.GetProperty("value").ToString();270        internal async Task<string> InnerTextAsync()271            => (await Connection.SendMessageToServerAsync(Guid, "innerText").ConfigureAwait(false))?.GetProperty("value").ToString();272        internal async Task<string> TextContentAsync()273            => (await Connection.SendMessageToServerAsync(Guid, "textContent").ConfigureAwait(false))?.GetProperty("value").ToString();274        internal Task SelectTextAsync(bool? force = null, float? timeout = null)275        {276            var args = new Dictionary<string, object>277            {278                ["force"] = force,279                ["timeout"] = timeout,280            };281            return Connection.SendMessageToServerAsync<ElementHandleChannel>(Guid, "selectText", args);282        }283        internal async Task<IReadOnlyList<string>> SelectOptionAsync(object values, bool? noWaitAfter = null, bool? force = null, float? timeout = null)284        {285            var args = new Dictionary<string, object>();286            if (values is IElementHandle[])287            {...Locator.cs
Source:Locator.cs  
...42            _selector = selector;43            _options = options;44            if (options?.HasTextRegex != null)45            {46                _selector += $" >> :scope:text-matches({options.HasTextRegex.ToString().EscapeWithQuotes("\"")}, {options.HasTextRegex.Options.GetInlineFlags().EscapeWithQuotes("\"")})";47            }48            if (options?.HasTextString != null)49            {50                _selector += $" >> :scope:has-text({options.HasTextString.EscapeWithQuotes("\"")})";51            }52            if (options?.Has != null)53            {54                var has = (Locator)options.Has;55                if (has._frame != _frame)56                {57                    throw new ArgumentException("Inner \"has\" locator must belong to the same frame.");58                }59                _selector += " >> has=" + JsonSerializer.Serialize(has._selector);60            }61        }62        public ILocator First => new Locator(_frame, $"{_selector} >> nth=0");63        public ILocator Last => new Locator(_frame, $"{_selector} >> nth=-1");64        IPage ILocator.Page => _frame.Page;65        public async Task<IReadOnlyList<string>> AllInnerTextsAsync()66            => await EvaluateAllAsync<string[]>("ee => ee.map(e => e.innerText)").ConfigureAwait(false);67        public async Task<IReadOnlyList<string>> AllTextContentsAsync()68            => await EvaluateAllAsync<string[]>("ee => ee.map(e => e.textContent || '')").ConfigureAwait(false);69        public async Task<LocatorBoundingBoxResult> BoundingBoxAsync(LocatorBoundingBoxOptions options = null)70            => await WithElementAsync(71                async (h, _) =>72                {73                    var bb = await h.BoundingBoxAsync().ConfigureAwait(false);74                    if (bb == null)75                    {76                        return null;77                    }78                    return new LocatorBoundingBoxResult()79                    {80                        Height = bb.Height,81                        Width = bb.Width,82                        X = bb.X,83                        Y = bb.Y,84                    };85                },86                options).ConfigureAwait(false);87        public Task CheckAsync(LocatorCheckOptions options = null)88            => _frame.CheckAsync(89                _selector,90                ConvertOptions<FrameCheckOptions>(options));91        public Task ClickAsync(LocatorClickOptions options = null)92            => _frame.ClickAsync(93                _selector,94                ConvertOptions<FrameClickOptions>(options));95        public Task SetCheckedAsync(bool checkedState, LocatorSetCheckedOptions options = null)96            => checkedState ?97                CheckAsync(ConvertOptions<LocatorCheckOptions>(options))98                : UncheckAsync(ConvertOptions<LocatorUncheckOptions>(options));99        public Task<int> CountAsync()100            => _frame.QueryCountAsync(_selector);101        public Task DblClickAsync(LocatorDblClickOptions options = null)102            => _frame.DblClickAsync(_selector, ConvertOptions<FrameDblClickOptions>(options));103        public Task DispatchEventAsync(string type, object eventInit = null, LocatorDispatchEventOptions options = null)104            => _frame.DispatchEventAsync(_selector, type, eventInit, ConvertOptions<FrameDispatchEventOptions>(options));105        public Task DragToAsync(ILocator target, LocatorDragToOptions options = null)106            => _frame.DragAndDropAsync(_selector, ((Locator)target)._selector, ConvertOptions<FrameDragAndDropOptions>(options));107        public async Task<IElementHandle> ElementHandleAsync(LocatorElementHandleOptions options = null)108            => await _frame.WaitForSelectorAsync(109                _selector,110                ConvertOptions<FrameWaitForSelectorOptions>(options)).ConfigureAwait(false);111        public Task<IReadOnlyList<IElementHandle>> ElementHandlesAsync()112            => _frame.QuerySelectorAllAsync(_selector);113        public Task<T> EvaluateAllAsync<T>(string expression, object arg = null)114            => _frame.EvalOnSelectorAllAsync<T>(_selector, expression, arg);115        public Task<JsonElement?> EvaluateAsync(string expression, object arg = null, LocatorEvaluateOptions options = null)116            => EvaluateAsync<JsonElement?>(expression, arg, options);117        public Task<T> EvaluateAsync<T>(string expression, object arg = null, LocatorEvaluateOptions options = null)118            => _frame.EvalOnSelectorAsync<T>(_selector, expression, arg, ConvertOptions<FrameEvalOnSelectorOptions>(options));119        public async Task<IJSHandle> EvaluateHandleAsync(string expression, object arg = null, LocatorEvaluateHandleOptions options = null)120            => await WithElementAsync(async (e, _) => await e.EvaluateHandleAsync(expression, arg).ConfigureAwait(false), options).ConfigureAwait(false);121        public async Task FillAsync(string value, LocatorFillOptions options = null)122            => await _frame.FillAsync(_selector, value, ConvertOptions<FrameFillOptions>(options)).ConfigureAwait(false);123        public Task FocusAsync(LocatorFocusOptions options = null)124            => _frame.FocusAsync(_selector, ConvertOptions<FrameFocusOptions>(options));125        IFrameLocator ILocator.FrameLocator(string selector) =>126            new FrameLocator(_frame, $"{_selector} >> {selector}");127        public Task<string> GetAttributeAsync(string name, LocatorGetAttributeOptions options = null)128            => _frame.GetAttributeAsync(_selector, name, ConvertOptions<FrameGetAttributeOptions>(options));129        public Task HoverAsync(LocatorHoverOptions options = null)130            => _frame.HoverAsync(_selector, ConvertOptions<FrameHoverOptions>(options));131        public Task<string> InnerHTMLAsync(LocatorInnerHTMLOptions options = null)132            => _frame.InnerHTMLAsync(_selector, ConvertOptions<FrameInnerHTMLOptions>(options));133        public Task<string> InnerTextAsync(LocatorInnerTextOptions options = null)134            => _frame.InnerTextAsync(_selector, ConvertOptions<FrameInnerTextOptions>(options));135        public Task<string> InputValueAsync(LocatorInputValueOptions options = null)136            => _frame.InputValueAsync(_selector, ConvertOptions<FrameInputValueOptions>(options));137        public Task<bool> IsCheckedAsync(LocatorIsCheckedOptions options = null)138            => _frame.IsCheckedAsync(_selector, ConvertOptions<FrameIsCheckedOptions>(options));139        public Task<bool> IsDisabledAsync(LocatorIsDisabledOptions options = null)140            => _frame.IsDisabledAsync(_selector, ConvertOptions<FrameIsDisabledOptions>(options));141        public Task<bool> IsEditableAsync(LocatorIsEditableOptions options = null)142            => _frame.IsEditableAsync(_selector, ConvertOptions<FrameIsEditableOptions>(options));143        public Task<bool> IsEnabledAsync(LocatorIsEnabledOptions options = null)144            => _frame.IsEnabledAsync(_selector, ConvertOptions<FrameIsEnabledOptions>(options));145        public Task<bool> IsHiddenAsync(LocatorIsHiddenOptions options = null)146            => _frame.IsHiddenAsync(_selector, ConvertOptions<FrameIsHiddenOptions>(options));147        public Task<bool> IsVisibleAsync(LocatorIsVisibleOptions options = null)148            => _frame.IsVisibleAsync(_selector, ConvertOptions<FrameIsVisibleOptions>(options));149        public ILocator Nth(int index)150            => new Locator(_frame, $"{_selector} >> nth={index}");151        public Task PressAsync(string key, LocatorPressOptions options = null)152            => _frame.PressAsync(_selector, key, ConvertOptions<FramePressOptions>(options));153        public Task<byte[]> ScreenshotAsync(LocatorScreenshotOptions options = null)154            => WithElementAsync(async (h, o) => await h.ScreenshotAsync(ConvertOptions<ElementHandleScreenshotOptions>(o)).ConfigureAwait(false), options);155        public Task ScrollIntoViewIfNeededAsync(LocatorScrollIntoViewIfNeededOptions options = null)156            => WithElementAsync(async (h, o) => await h.ScrollIntoViewIfNeededAsync(ConvertOptions<ElementHandleScrollIntoViewIfNeededOptions>(o)).ConfigureAwait(false), options);157        public Task<IReadOnlyList<string>> SelectOptionAsync(string values, LocatorSelectOptionOptions options = null)158            => _frame.SelectOptionAsync(_selector, values, ConvertOptions<FrameSelectOptionOptions>(options));159        public Task<IReadOnlyList<string>> SelectOptionAsync(IElementHandle values, LocatorSelectOptionOptions options = null)160            => _frame.SelectOptionAsync(_selector, values, ConvertOptions<FrameSelectOptionOptions>(options));161        public Task<IReadOnlyList<string>> SelectOptionAsync(IEnumerable<string> values, LocatorSelectOptionOptions options = null)162            => _frame.SelectOptionAsync(_selector, values, ConvertOptions<FrameSelectOptionOptions>(options));163        public Task<IReadOnlyList<string>> SelectOptionAsync(SelectOptionValue values, LocatorSelectOptionOptions options = null)164            => _frame.SelectOptionAsync(_selector, values, ConvertOptions<FrameSelectOptionOptions>(options));165        public Task<IReadOnlyList<string>> SelectOptionAsync(IEnumerable<IElementHandle> values, LocatorSelectOptionOptions options = null)166            => _frame.SelectOptionAsync(_selector, values, ConvertOptions<FrameSelectOptionOptions>(options));167        public Task<IReadOnlyList<string>> SelectOptionAsync(IEnumerable<SelectOptionValue> values, LocatorSelectOptionOptions options = null)168            => _frame.SelectOptionAsync(_selector, values, ConvertOptions<FrameSelectOptionOptions>(options));169        public Task SelectTextAsync(LocatorSelectTextOptions options = null)170            => WithElementAsync((h, o) => h.SelectTextAsync(ConvertOptions<ElementHandleSelectTextOptions>(o)), options);171        public Task SetInputFilesAsync(string files, LocatorSetInputFilesOptions options = null)172            => _frame.SetInputFilesAsync(_selector, files, ConvertOptions<FrameSetInputFilesOptions>(options));173        public Task SetInputFilesAsync(IEnumerable<string> files, LocatorSetInputFilesOptions options = null)174            => _frame.SetInputFilesAsync(_selector, files, ConvertOptions<FrameSetInputFilesOptions>(options));175        public Task SetInputFilesAsync(FilePayload files, LocatorSetInputFilesOptions options = null)176            => _frame.SetInputFilesAsync(_selector, files, ConvertOptions<FrameSetInputFilesOptions>(options));177        public Task SetInputFilesAsync(IEnumerable<FilePayload> files, LocatorSetInputFilesOptions options = null)178            => _frame.SetInputFilesAsync(_selector, files, ConvertOptions<FrameSetInputFilesOptions>(options));179        public Task TapAsync(LocatorTapOptions options = null)180            => _frame.TapAsync(_selector, ConvertOptions<FrameTapOptions>(options));181        public Task<string> TextContentAsync(LocatorTextContentOptions options = null)182            => _frame.TextContentAsync(_selector, ConvertOptions<FrameTextContentOptions>(options));183        public Task TypeAsync(string text, LocatorTypeOptions options = null)184            => _frame.TypeAsync(_selector, text, ConvertOptions<FrameTypeOptions>(options));185        public Task UncheckAsync(LocatorUncheckOptions options = null)186            => _frame.UncheckAsync(_selector, ConvertOptions<FrameUncheckOptions>(options));187        ILocator ILocator.Locator(string selector, LocatorLocatorOptions options)188            => new Locator(_frame, $"{_selector} >> {selector}", options);189        public Task WaitForAsync(LocatorWaitForOptions options = null)190            => _frame.LocatorWaitForAsync(_selector, ConvertOptions<LocatorWaitForOptions>(options));191        internal Task<FrameExpectResult> ExpectAsync(string expression, FrameExpectOptions options = null)192            => _frame.ExpectAsync(193                _selector,194                expression,195                options);196        public override string ToString() => "Locator@" + _selector;197        private T ConvertOptions<T>(object source)198            where T : class, new()199        {200            T target = new();201            var targetType = target.GetType();202            if (source != null)203            {204                var sourceType = source.GetType();205                foreach (var sourceProperty in sourceType.GetProperties())206                {207                    var targetProperty = targetType.GetProperty(sourceProperty.Name);208                    if (targetProperty != null)209                    {210                        targetProperty.SetValue(target, sourceProperty.GetValue(source));...AssertionsBase.cs
Source:AssertionsBase.cs  
...82            {83                throw new ArgumentNullException(nameof(pattern));84            }85            ExpectedTextValue textValue = options ?? new() { };86            textValue.RegexSource = pattern.ToString();87            textValue.RegexFlags = pattern.Options.GetInlineFlags();88            return textValue;89        }90        internal T ConvertToType<T>(object source)91            where T : new()92        {93            T target = new();94            if (source == null)95            {96                return target;97            }98            var sourceType = source.GetType();99            var targetType = target.GetType();100            foreach (var sourceProperty in sourceType.GetProperties())101            {102                var targetProperty = targetType.GetProperty(sourceProperty.Name);103                if (targetProperty != null)104                {105                    targetProperty.SetValue(target, sourceProperty.GetValue(source));106                }107            }108            return target;109        }110        internal FrameExpectOptions ConvertToFrameExpectOptions(object source) => ConvertToType<FrameExpectOptions>(source);111        private string FormatValue(object value)112        {113            if (value == null)114            {115                return "null";116            }117            if (value is string)118            {119                return (string)value;120            }121            if (value is IEnumerable<object>)122            {123                return "[" + string.Join(", ", ((IEnumerable<object>)value).Select(value => $"'{value}'")) + "]";124            }125            return value.ToString();126        }127    }128}...ToString
Using AI Code Generation
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Threading.Tasks;6using Microsoft.Playwright;7{8    {9        static async Task Main(string[] args)10        {11            using var playwright = await Playwright.CreateAsync();12            await using var browser = await playwright.Chromium.LaunchAsync(new LaunchOptions13            {14            });15            var page = await browser.NewPageAsync();16            var locator = page.Locator("input[name='q']");17            Console.WriteLine(locator.ToString());18            Console.ReadKey();19        }20    }21}ToString
Using AI Code Generation
1using Microsoft.Playwright;2using System;3using System.Threading.Tasks;4{5    {6        static async Task Main(string[] args)7        {8            using var playwright = await Playwright.CreateAsync();9            await using var browser = await playwright.Firefox.LaunchAsync(new BrowserTypeLaunchOptions10            {11            });12            var page = await browser.NewPageAsync();13            await page.ClickAsync("text=Sign in");14            await page.ClickAsync("xpathToString
Using AI Code Generation
1using Microsoft.Playwright;2using Microsoft.Playwright.Core;3using System;4using System.Collections.Generic;5using System.Linq;6using System.Text;7using System.Threading.Tasks;8{9    {10        static async Task Main(string[] args)11        {12            using var playwright = await Playwright.CreateAsync();13            await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions14            {15            });16            var page = await browser.NewPageAsync();17            await page.ClickAsync("text=Sign in");18            await page.FillAsync("input[name=\"identifier\"]", "test");19            await page.PressAsync("input[name=\"identifier\"]", "Enter");20            await page.FillAsync("input[name=\"password\"]", "test");21            await page.PressAsync("input[name=\"password\"]", "Enter");22            await page.ScreenshotAsync(new PageScreenshotOptions23            {24            });25            await page.ClickAsync("text=Images");26            await page.ScreenshotAsync(new PageScreenshotOptions27            {28            });29            await page.ClickAsync("text=Sign out");30            await page.ScreenshotAsync(new PageScreenshotOptions31            {32            });33            await page.ClickAsync("text=Images");34            await page.ScreenshotAsync(new PageScreenshotOptions35            {36            });37            await page.ClickAsync("text=Sign in");38            await page.ScreenshotAsync(new PageScreenshotOptions39            {40            });41            await page.FillAsync("ToString
Using AI Code Generation
1var playwright = await Microsoft.Playwright.Core.Playwright.CreateAsync();2var browser = await playwright.Chromium.LaunchAsync();3var page = await browser.NewPageAsync();4await page.ClickAsync("input[name=\"q\"]");5await page.TypeAsync("input[name=\"q\"]", "Playwright");6await page.ClickAsync("text=Google Search");7await page.ClickAsync("text=Playwright: Node.js library to automate Chromium, Firefox and WebKit with a single API");8await page.ClickAsync("text=Get started");9await page.ClickAsync("text=API reference");10await page.ClickAsync("text=Playwright");11await page.ClickAsync("text=Playwright: Node.js library to automate Chromium, Firefox and WebKit with a single API");12await page.ClickAsync("text=Get started");13await page.ClickAsync("text=API reference");14await page.ClickAsync("text=Playwright");15await page.ClickAsync("text=Playwright: Node.js library to automate Chromium, Firefox and WebKit with a single API");16await page.ClickAsync("text=Get started");17await page.ClickAsync("text=API reference");18await page.ClickAsync("text=Playwright");19await page.ClickAsync("text=Playwright: Node.js library to automate Chromium, Firefox and WebKit with a single API");20await page.ClickAsync("text=Get started");21await page.ClickAsync("text=API reference");22await page.ClickAsync("text=Playwright");23await page.ClickAsync("text=Playwright: Node.js library to automate Chromium, Firefox and WebKit with a single API");24await page.ClickAsync("text=Get started");25await page.ClickAsync("text=API reference");26await page.ClickAsync("text=Playwright");27await page.ClickAsync("text=Playwright: Node.js library to automate Chromium, Firefox and WebKit with a single API");28await page.ClickAsync("text=Get started");29await page.ClickAsync("text=API reference");30await page.ClickAsync("text=Playwright");31await page.ClickAsync("text=Playwright: Node.js library to automate Chromium, Firefox and WebKit with a single API");32await page.ClickAsync("text=Get started");33await page.ClickAsync("text=API reference");34await page.ClickAsync("text=Playwright");35await page.ClickAsync("text=Playwright: Node.js library to automate Chromium, Firefox and WebKit with a single APIToString
Using AI Code Generation
1using Microsoft.Playwright;2using System;3using System.Threading.Tasks;4{5    static async Task Main()6    {7        using var playwright = await Playwright.CreateAsync();8        await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions9        {10        });11        var context = await browser.NewContextAsync();12        var page = await context.NewPageAsync();13        await page.ScreenshotAsync("example.png");14        var locator = page.Locator(".b_searchbox");15        Console.WriteLine(locator.ToString());16    }17}ToString
Using AI Code Generation
1using System;2using Microsoft.Playwright;3using Microsoft.Playwright.Core;4{5    {6        static async Task Main(string[] args)7        {8            using var playwright = await Playwright.CreateAsync();9            using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions10            {11            });12            using var page = await browser.NewPageAsync();13            Locator locator = page.Locator("#tsf > div:nth-child(2) > div > div.FPdoLc.VlcLAe > center > input[type=\"submit\"]:nth-child(1)");14            Console.WriteLine(locator.ToString());15        }16    }17}18Locator: css=#tsf > div:nth-child(2) > div > div.FPdoLc.VlcLAe > center > input[type="submit"]:nth-child(1)19Method Description Locator.AtIndex(int index) Returns a new locator that matches the element at the specified index. Locator.AtMost(int count) Returns a new locator that matches at most the specified number of elements. Locator.AtMostOne() Returns a new locator that matches at most one element. Locator.AtMostOneOrNull() Returns a new locator that matches at most one element or null. Locator.AtMostOrNull(int count) Returns a new locator that matches at most the specified number of elements or null. Locator.AtMostOneOrNull() Returns a new locator that matches at most one element or null. Locator.AtMostOrNull(int count) Returns a new locator that matches at most the specified number of elements or null. Locator.First() Returns a new locator that matches the first element. Locator.FirstOrNull() Returns a new locator that matches the first element or null. Locator.Last() Returns a new locator that matches the last element. Locator.LastOrNull() Returns a new locator that matches the last element or null. Locator.WithText(string text) Returns a new locator that matches elements containing the specified text. Locator.WithText(Regex text) Returns a new locator that matches elements containing the specified text. LocatorToString
Using AI Code Generation
1using Microsoft.Playwright;2using System;3using System.Threading.Tasks;4{5    {6        static async Task Main(string[] args)7        {8            using var playwright = await Playwright.CreateAsync();9            var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions10            {11            });12            var page = await browser.NewPageAsync();13            await page.ClickAsync("text=About");14            await browser.CloseAsync();15        }16    }17}LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!
