Best Playwright-dotnet code snippet using Microsoft.Playwright.Core.WritableStream.new
FrameChannel.cs
Source:FrameChannel.cs
...44 switch (method)45 {46 case "navigated":47 var e = serverParams?.ToObject<FrameNavigatedEventArgs>(Connection.DefaultJsonSerializerOptions);48 if (serverParams.Value.TryGetProperty("newDocument", out var documentElement))49 {50 e.NewDocument = documentElement.ToObject<NavigateDocument>(Connection.DefaultJsonSerializerOptions);51 }52 Navigated?.Invoke(this, e);53 break;54 case "loadstate":55 LoadState?.Invoke(56 this,57 serverParams?.ToObject<FrameChannelLoadStateEventArgs>(Connection.DefaultJsonSerializerOptions));58 break;59 }60 }61 internal Task<ElementHandleChannel> QuerySelectorAsync(string selector, bool? strict)62 {63 var args = new Dictionary<string, object>64 {65 ["selector"] = selector,66 ["strict"] = strict,67 };68 return Connection.SendMessageToServerAsync<ElementHandleChannel>(Guid, "querySelector", args);69 }70 internal Task<ResponseChannel> GotoAsync(string url, float? timeout, WaitUntilState? waitUntil, string referer)71 {72 var args = new Dictionary<string, object>73 {74 ["url"] = url,75 ["timeout"] = timeout,76 ["waitUntil"] = waitUntil,77 ["referer"] = referer,78 };79 return Connection.SendMessageToServerAsync<ResponseChannel>(Guid, "goto", args);80 }81 internal Task<JSHandleChannel> EvaluateExpressionHandleAsync(82 string script,83 object arg)84 {85 return Connection.SendMessageToServerAsync<JSHandleChannel>(86 Guid,87 "evaluateExpressionHandle",88 new Dictionary<string, object>89 {90 ["expression"] = script,91 ["arg"] = arg,92 });93 }94 internal Task<JSHandleChannel> WaitForFunctionAsync(95 string expression,96 object arg,97 float? timeout,98 float? polling)99 {100 var args = new Dictionary<string, object>101 {102 ["expression"] = expression,103 ["arg"] = arg,104 ["timeout"] = timeout,105 ["pollingInterval"] = polling,106 };107 return Connection.SendMessageToServerAsync<JSHandleChannel>(108 Guid,109 "waitForFunction",110 args);111 }112 internal Task<JsonElement?> EvaluateExpressionAsync(113 string script,114 object arg)115 {116 return Connection.SendMessageToServerAsync<JsonElement?>(117 Guid,118 "evaluateExpression",119 new Dictionary<string, object>120 {121 ["expression"] = script,122 ["arg"] = arg,123 });124 }125 internal Task<JsonElement?> EvalOnSelectorAsync(string selector, string script, object arg, bool? strict)126 => Connection.SendMessageToServerAsync<JsonElement?>(127 Guid,128 "evalOnSelector",129 new Dictionary<string, object>130 {131 ["selector"] = selector,132 ["expression"] = script,133 ["arg"] = arg,134 ["strict"] = strict,135 });136 internal Task<JsonElement?> EvalOnSelectorAllAsync(string selector, string script, object arg)137 => Connection.SendMessageToServerAsync<JsonElement?>(138 Guid,139 "evalOnSelectorAll",140 new Dictionary<string, object>141 {142 ["selector"] = selector,143 ["expression"] = script,144 ["arg"] = arg,145 });146 internal Task<ElementHandleChannel> FrameElementAsync() => Connection.SendMessageToServerAsync<ElementHandleChannel>(Guid, "frameElement", null);147 internal async Task<string> TitleAsync()148 => (await Connection.SendMessageToServerAsync(Guid, "title", null).ConfigureAwait(false))?.GetProperty("value").ToString();149 internal Task<ElementHandleChannel> WaitForSelectorAsync(string selector, WaitForSelectorState? state, float? timeout, bool? strict, bool? omitReturnValue)150 {151 var args = new Dictionary<string, object>152 {153 ["selector"] = selector,154 ["timeout"] = timeout,155 ["state"] = state,156 ["strict"] = strict,157 ["omitReturnValue"] = omitReturnValue,158 };159 return Connection.SendMessageToServerAsync<ElementHandleChannel>(160 Guid,161 "waitForSelector",162 args);163 }164 internal Task WaitForTimeoutAsync(float timeout)165 {166 var args = new Dictionary<string, object>167 {168 ["timeout"] = timeout,169 };170 return Connection.SendMessageToServerAsync<ElementHandleChannel>(171 Guid,172 "waitForTimeout",173 args);174 }175 internal Task<ElementHandleChannel> AddScriptTagAsync(string url, string path, string content, string type)176 {177 var args = new Dictionary<string, object>178 {179 ["url"] = url,180 ["path"] = path,181 ["content"] = content,182 ["type"] = type,183 };184 return Connection.SendMessageToServerAsync<ElementHandleChannel>(Guid, "addScriptTag", args);185 }186 internal Task<ElementHandleChannel> AddStyleTagAsync(string url, string path, string content)187 {188 var args = new Dictionary<string, object>189 {190 ["url"] = url,191 ["path"] = path,192 ["content"] = content,193 };194 return Connection.SendMessageToServerAsync<ElementHandleChannel>(Guid, "addStyleTag", args);195 }196 internal Task<ResponseChannel> WaitForNavigationAsync(LoadState? waitUntil, string url, float? timeout)197 {198 var param = new Dictionary<string, object>199 {200 ["timeout"] = timeout,201 ["url"] = url,202 ["waitUntil"] = waitUntil,203 };204 return Connection.SendMessageToServerAsync<ResponseChannel>(Guid, "waitForNavigation", param);205 }206 internal Task WaitForLoadStateAsync(LoadState? state, float? timeout)207 {208 var param = new Dictionary<string, object>209 {210 ["timeout"] = timeout,211 ["state"] = state,212 };213 return Connection.SendMessageToServerAsync(214 Guid,215 "waitForLoadState",216 param);217 }218 internal async Task<int> QueryCountAsync(string selector)219 {220 var args = new Dictionary<string, object>221 {222 ["selector"] = selector,223 };224 var result = await Connection.SendMessageToServerAsync(Guid, "queryCount", args).ConfigureAwait(false);225 return result.Value.GetProperty("value").GetInt32();226 }227 internal Task SetContentAsync(string html, float? timeout, WaitUntilState? waitUntil)228 {229 var args = new Dictionary<string, object>230 {231 ["html"] = html,232 ["waitUntil"] = waitUntil,233 ["timeout"] = timeout,234 };235 return Connection.SendMessageToServerAsync(Guid, "setContent", args);236 }237 internal Task ClickAsync(238 string selector,239 float? delay,240 MouseButton? button,241 int? clickCount,242 IEnumerable<KeyboardModifier> modifiers,243 Position position,244 float? timeout,245 bool? force,246 bool? noWaitAfter,247 bool? trial,248 bool? strict)249 {250 var args = new Dictionary<string, object>251 {252 ["selector"] = selector,253 ["button"] = button,254 ["force"] = force,255 ["delay"] = delay,256 ["clickCount"] = clickCount,257 ["modifiers"] = modifiers?.Select(m => m.ToValueString()),258 ["position"] = position,259 ["noWaitAfter"] = noWaitAfter,260 ["trial"] = trial,261 ["timeout"] = timeout,262 ["strict"] = strict,263 };264 return Connection.SendMessageToServerAsync<ElementHandleChannel>(Guid, "click", args);265 }266 internal Task DblClickAsync(267 string selector,268 float? delay,269 MouseButton? button,270 Position position,271 IEnumerable<KeyboardModifier> modifiers,272 float? timeout,273 bool? force,274 bool? noWaitAfter,275 bool? trial,276 bool? strict)277 {278 var args = new Dictionary<string, object>279 {280 ["selector"] = selector,281 ["button"] = button,282 ["delay"] = delay,283 ["force"] = force,284 ["modifiers"] = modifiers?.Select(m => m.ToValueString()),285 ["position"] = position,286 ["trial"] = trial,287 ["timeout"] = timeout,288 ["noWaitAfter"] = noWaitAfter,289 ["strict"] = strict,290 };291 return Connection.SendMessageToServerAsync<ElementHandleChannel>(Guid, "dblclick", args);292 }293 internal Task<ElementHandleChannel> QuerySelectorAsync(string selector)294 => Connection.SendMessageToServerAsync<ElementHandleChannel>(295 Guid,296 "querySelector",297 new Dictionary<string, object>298 {299 ["selector"] = selector,300 });301 internal Task<ChannelBase[]> QuerySelectorAllAsync(string selector)302 => Connection.SendMessageToServerAsync<ChannelBase[]>(303 Guid,304 "querySelectorAll",305 new Dictionary<string, object>306 {307 ["selector"] = selector,308 });309 internal Task FillAsync(string selector, string value, bool? force, float? timeout, bool? noWaitAfter, bool? strict)310 {311 var args = new Dictionary<string, object>312 {313 ["selector"] = selector,314 ["value"] = value,315 ["force"] = force,316 ["timeout"] = timeout,317 ["noWaitAfter"] = noWaitAfter,318 ["strict"] = strict,319 };320 return Connection.SendMessageToServerAsync(Guid, "fill", args);321 }322 internal Task CheckAsync(string selector, Position position, float? timeout, bool? force, bool? noWaitAfter, bool? trial, bool? strict)323 {324 var args = new Dictionary<string, object>325 {326 ["selector"] = selector,327 ["force"] = force,328 ["position"] = position,329 ["noWaitAfter"] = noWaitAfter,330 ["trial"] = trial,331 ["timeout"] = timeout,332 ["strict"] = strict,333 };334 return Connection.SendMessageToServerAsync<ElementHandleChannel>(Guid, "check", args);335 }336 internal Task UncheckAsync(string selector, Position position, float? timeout, bool? force, bool? noWaitAfter, bool? trial, bool? strict)337 {338 var args = new Dictionary<string, object>339 {340 ["selector"] = selector,341 ["force"] = force,342 ["position"] = position,343 ["noWaitAfter"] = noWaitAfter,344 ["trial"] = trial,345 ["timeout"] = timeout,346 ["strict"] = strict,347 };348 return Connection.SendMessageToServerAsync<ElementHandleChannel>(Guid, "uncheck", args);349 }350 internal Task DispatchEventAsync(string selector, string type, object eventInit, float? timeout, bool? strict)351 {352 var args = new Dictionary<string, object>353 {354 ["selector"] = selector,355 ["type"] = type,356 ["eventInit"] = eventInit,357 ["timeout"] = timeout,358 ["strict"] = strict,359 };360 return Connection.SendMessageToServerAsync(Guid, "dispatchEvent", args);361 }362 internal Task HoverAsync(363 string selector,364 Position position,365 IEnumerable<KeyboardModifier> modifiers,366 bool? force,367 float? timeout,368 bool? trial,369 bool? strict)370 {371 var args = new Dictionary<string, object>372 {373 ["selector"] = selector,374 ["force"] = force,375 ["modifiers"] = modifiers?.Select(m => m.ToValueString()),376 ["position"] = position,377 ["trial"] = trial,378 ["timeout"] = timeout,379 ["strict"] = strict,380 };381 return Connection.SendMessageToServerAsync(Guid, "hover", args);382 }383 internal Task PressAsync(string selector, string text, float? delay, float? timeout, bool? noWaitAfter, bool? strict)384 {385 var args = new Dictionary<string, object>386 {387 ["selector"] = selector,388 ["key"] = text,389 ["delay"] = delay,390 ["timeout"] = timeout,391 ["noWaitAfter"] = noWaitAfter,392 ["strict"] = strict,393 };394 return Connection.SendMessageToServerAsync(Guid, "press", args);395 }396 internal async Task<string[]> SelectOptionAsync(string selector, IEnumerable<SelectOptionValue> values, bool? noWaitAfter, bool? strict, bool? force, float? timeout)397 {398 var args = new Dictionary<string, object>399 {400 ["selector"] = selector,401 ["options"] = values,402 ["noWaitAfter"] = noWaitAfter,403 ["strict"] = strict,404 ["force"] = force,405 ["timeout"] = timeout,406 };407 return (await Connection.SendMessageToServerAsync(Guid, "selectOption", args).ConfigureAwait(false))?.GetProperty("values").ToObject<string[]>();408 }409 internal async Task<string[]> SelectOptionAsync(string selector, IEnumerable<ElementHandle> values, bool? noWaitAfter, bool? strict, bool? force, float? timeout)410 {411 var args = new Dictionary<string, object>412 {413 ["selector"] = selector,414 ["elements"] = values,415 ["noWaitAfter"] = noWaitAfter,416 ["strict"] = strict,417 ["force"] = force,418 ["timeout"] = timeout,419 };420 return (await Connection.SendMessageToServerAsync(Guid, "selectOption", args).ConfigureAwait(false))?.GetProperty("values").ToObject<string[]>();421 }422 internal async Task<string> GetAttributeAsync(string selector, string name, float? timeout, bool? strict)423 {424 var args = new Dictionary<string, object>425 {426 ["selector"] = selector,427 ["name"] = name,428 ["timeout"] = timeout,429 ["strict"] = strict,430 };431 JsonElement retValue = default;432 if ((await Connection.SendMessageToServerAsync(Guid, "getAttribute", args).ConfigureAwait(false))?.TryGetProperty("value", out retValue) ?? false)433 {434 return retValue.ToString();435 }436 return null;437 }438 internal async Task<string> InnerHTMLAsync(string selector, float? timeout, bool? strict)439 {440 var args = new Dictionary<string, object>441 {442 ["selector"] = selector,443 ["timeout"] = timeout,444 ["strict"] = strict,445 };446 return (await Connection.SendMessageToServerAsync(Guid, "innerHTML", args).ConfigureAwait(false))?.GetProperty("value").ToString();447 }448 internal Task TypeAsync(string selector, string text, float? delay, float? timeout, bool? noWaitAfter, bool? strict)449 {450 var args = new Dictionary<string, object>451 {452 ["selector"] = selector,453 ["text"] = text,454 ["delay"] = delay,455 ["noWaitAfter"] = noWaitAfter,456 ["timeout"] = timeout,457 ["strict"] = strict,458 };459 return Connection.SendMessageToServerAsync(Guid, "type", args);460 }461 internal async Task<string> ContentAsync()462 => (await Connection.SendMessageToServerAsync(463 Guid,464 "content",465 null).ConfigureAwait(false))?.GetProperty("value").ToString();466 internal Task FocusAsync(string selector, float? timeout, bool? strict)467 {468 var args = new Dictionary<string, object>469 {470 ["selector"] = selector,471 ["timeout"] = timeout,472 ["strict"] = strict,473 };474 return Connection.SendMessageToServerAsync(Guid, "focus", args);475 }476 internal async Task<string> InnerTextAsync(string selector, float? timeout, bool? strict)477 {478 var args = new Dictionary<string, object>479 {480 ["selector"] = selector,481 ["timeout"] = timeout,482 ["strict"] = strict,483 };484 return (await Connection.SendMessageToServerAsync(Guid, "innerText", args).ConfigureAwait(false))?.GetProperty("value").ToString();485 }486 internal Task SetInputFilesAsync(string selector, IEnumerable<InputFilesList> files, bool? noWaitAfter, float? timeout, bool? strict)487 {488 var args = new Dictionary<string, object>489 {490 ["selector"] = selector,491 ["files"] = files,492 ["noWaitAfter"] = noWaitAfter,493 ["timeout"] = timeout,494 ["strict"] = strict,495 };496 return Connection.SendMessageToServerAsync(Guid, "setInputFiles", args);497 }498 internal Task SetInputFilePathsAsync(string selector, IEnumerable<string> localPaths, IEnumerable<WritableStream> streams, bool? noWaitAfter, float? timeout, bool? strict)499 {500 var args = new Dictionary<string, object>501 {502 ["selector"] = selector,503 ["localPaths"] = localPaths,504 ["streams"] = streams,505 ["timeout"] = timeout,506 ["noWaitAfter"] = noWaitAfter,507 ["strict"] = strict,508 };509 return Connection.SendMessageToServerAsync(Guid, "setInputFilePaths", args);510 }511 internal async Task<string> TextContentAsync(string selector, float? timeout, bool? strict)512 {513 var args = new Dictionary<string, object>514 {515 ["selector"] = selector,516 ["timeout"] = timeout,517 ["strict"] = strict,518 };519 return (await Connection.SendMessageToServerAsync(Guid, "textContent", args).ConfigureAwait(false))?.GetProperty("value").ToString();520 }521 internal Task TapAsync(522 string selector,523 IEnumerable<KeyboardModifier> modifiers,524 Position position,525 float? timeout,526 bool? force,527 bool? noWaitAfter,528 bool? trial,529 bool? strict)530 {531 var args = new Dictionary<string, object>532 {533 ["selector"] = selector,534 ["force"] = force,535 ["modifiers"] = modifiers?.Select(m => m.ToValueString()),536 ["noWaitAfter"] = noWaitAfter,537 ["trial"] = trial,538 ["timeout"] = timeout,539 ["position"] = position,540 ["strict"] = strict,541 };542 return Connection.SendMessageToServerAsync(Guid, "tap", args);543 }544 internal async Task<bool> IsCheckedAsync(string selector, float? timeout, bool? strict)545 {546 var args = new Dictionary<string, object>547 {548 ["selector"] = selector,549 ["timeout"] = timeout,550 ["strict"] = strict,551 };552 return (await Connection.SendMessageToServerAsync(Guid, "isChecked", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default;553 }554 internal async Task<bool> IsDisabledAsync(string selector, float? timeout, bool? strict)555 {556 var args = new Dictionary<string, object>557 {558 ["selector"] = selector,559 ["timeout"] = timeout,560 ["strict"] = strict,561 };562 return (await Connection.SendMessageToServerAsync(Guid, "isDisabled", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default;563 }564 internal async Task<bool> IsEditableAsync(string selector, float? timeout, bool? strict)565 {566 var args = new Dictionary<string, object>567 {568 ["selector"] = selector,569 ["timeout"] = timeout,570 ["strict"] = strict,571 };572 return (await Connection.SendMessageToServerAsync(Guid, "isEditable", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default;573 }574 internal async Task<bool> IsEnabledAsync(string selector, float? timeout, bool? strict)575 {576 var args = new Dictionary<string, object>577 {578 ["selector"] = selector,579 ["timeout"] = timeout,580 ["strict"] = strict,581 };582 return (await Connection.SendMessageToServerAsync(Guid, "isEnabled", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default;583 }584 internal async Task<bool> IsHiddenAsync(string selector, float? timeout, bool? strict)585 {586 var args = new Dictionary<string, object>587 {588 ["selector"] = selector,589 ["timeout"] = timeout,590 ["strict"] = strict,591 };592 return (await Connection.SendMessageToServerAsync(Guid, "isHidden", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default;593 }594 internal async Task<bool> IsVisibleAsync(string selector, float? timeout, bool? strict)595 {596 var args = new Dictionary<string, object>597 {598 ["selector"] = selector,599 ["timeout"] = timeout,600 ["strict"] = strict,601 };602 return (await Connection.SendMessageToServerAsync(Guid, "isVisible", args).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default;603 }604 internal async Task<string> InputValueAsync(string selector, float? timeout, bool? strict)605 {606 var args = new Dictionary<string, object>607 {608 ["selector"] = selector,609 ["timeout"] = timeout,610 ["strict"] = strict,611 };612 return (await Connection.SendMessageToServerAsync(Guid, "inputValue", args).ConfigureAwait(false))?.GetProperty("value").ToString();613 }614 internal Task DragAndDropAsync(string source, string target, bool? force, bool? noWaitAfter, float? timeout, bool? trial, bool? strict)615 {616 var args = new Dictionary<string, object>617 {618 ["source"] = source,619 ["target"] = target,620 ["force"] = force,621 ["noWaitAfter"] = noWaitAfter,622 ["timeout"] = timeout,623 ["trial"] = trial,624 ["strict"] = strict,625 };626 return Connection.SendMessageToServerAsync(Guid, "dragAndDrop", args);627 }628 internal async Task<FrameExpectResult> ExpectAsync(string selector, string expression, object expressionArg, ExpectedTextValue[] expectedText, int? expectedNumber, object expectedValue, bool? useInnerText, bool? isNot, float? timeout)629 {630 var args = new Dictionary<string, object>631 {632 ["selector"] = selector,633 ["expression"] = expression,634 ["expressionArg"] = expressionArg,635 ["expectedText"] = expectedText,636 ["expectedNumber"] = expectedNumber,637 ["expectedValue"] = expectedValue,638 ["useInnerText"] = useInnerText,639 ["isNot"] = isNot,640 ["timeout"] = timeout,641 };642 var result = await Connection.SendMessageToServerAsync(Guid, "expect", args).ConfigureAwait(false);643 var parsed = result.Value.ToObject<FrameExpectResult>();644 if (result.Value.TryGetProperty("received", out var received))645 {646 var outs = ScriptsHelper.ParseEvaluateResult<object>(received);647 parsed.Received = outs;648 }649 return parsed;650 }651 internal async Task HighlightAsync(string selector)652 {653 var args = new Dictionary<string, object>654 {655 ["selector"] = selector,656 };657 await Connection.SendMessageToServerAsync(Guid, "highlight", args).ConfigureAwait(false);658 }659 }660}...
Connection.cs
Source:Connection.cs
...40namespace Microsoft.Playwright.Transport41{42 internal class Connection : IDisposable43 {44 private readonly ConcurrentDictionary<int, ConnectionCallback> _callbacks = new();45 private readonly Root _rootObject;46 private readonly TaskQueue _queue = new();47 private int _lastId;48 private string _reason = string.Empty;49 public Connection()50 {51 _rootObject = new(null, this, string.Empty);52 DefaultJsonSerializerOptions = JsonExtensions.GetNewDefaultSerializerOptions();53 DefaultJsonSerializerOptions.Converters.Add(new ChannelToGuidConverter(this));54 DefaultJsonSerializerOptions.Converters.Add(new ChannelOwnerToGuidConverter<JSHandle>(this));55 DefaultJsonSerializerOptions.Converters.Add(new ChannelOwnerToGuidConverter<ElementHandle>(this));56 DefaultJsonSerializerOptions.Converters.Add(new ChannelOwnerToGuidConverter<IChannelOwner>(this));57 // Workaround for https://github.com/dotnet/runtime/issues/4652258 DefaultJsonSerializerOptions.Converters.Add(new ChannelOwnerListToGuidListConverter<WritableStream>(this));59 }60 /// <inheritdoc cref="IDisposable.Dispose"/>61 ~Connection() => Dispose(false);62 internal event EventHandler<string> Close;63 public ConcurrentDictionary<string, IChannelOwner> Objects { get; } = new();64 internal AsyncLocal<List<ApiZone>> ApiZone { get; } = new();65 public bool IsClosed { get; private set; }66 internal bool IsRemote { get; set; }67 internal Func<object, Task> OnMessage { get; set; }68 internal JsonSerializerOptions DefaultJsonSerializerOptions { get; }69 public void Dispose()70 {71 Dispose(true);72 GC.SuppressFinalize(this);73 }74 internal Task<JsonElement?> SendMessageToServerAsync(75 string guid,76 string method,77 object args = null)78 => SendMessageToServerAsync<JsonElement?>(guid, method, args);79 internal Task<T> SendMessageToServerAsync<T>(80 string guid,81 string method,82 object args = null) => WrapApiCallAsync(() => InnerSendMessageToServerAsync<T>(guid, method, args));83 private async Task<T> InnerSendMessageToServerAsync<T>(84 string guid,85 string method,86 object args = null)87 {88 if (IsClosed)89 {90 throw new PlaywrightException($"Connection closed ({_reason})");91 }92 int id = Interlocked.Increment(ref _lastId);93 var tcs = new TaskCompletionSource<JsonElement?>(TaskCreationOptions.RunContinuationsAsynchronously);94 var callback = new ConnectionCallback95 {96 TaskCompletionSource = tcs,97 };98 _callbacks.TryAdd(id, callback);99 var sanitizedArgs = new Dictionary<string, object>();100 if (args != null)101 {102 if (args is IDictionary<string, object> dictionary && dictionary.Keys.Any(f => f != null))103 {104 foreach (var kv in dictionary)105 {106 if (kv.Value != null)107 {108 sanitizedArgs.Add(kv.Key, kv.Value);109 }110 }111 }112 else113 {114 foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(args))115 {116 object obj = propertyDescriptor.GetValue(args);117 if (obj != null)118 {119#pragma warning disable CA1845 // Use span-based 'string.Concat' and 'AsSpan' instead of 'Substring120 string name = propertyDescriptor.Name.Substring(0, 1).ToLower() + propertyDescriptor.Name.Substring(1);121#pragma warning restore CA2000 // Use span-based 'string.Concat' and 'AsSpan' instead of 'Substring122 sanitizedArgs.Add(name, obj);123 }124 }125 }126 }127 await _queue.EnqueueAsync(() =>128 {129 var message = new MessageRequest130 {131 Id = id,132 Guid = guid,133 Method = method,134 Params = sanitizedArgs,135 Metadata = ApiZone.Value[0],136 };137 TraceMessage("pw:channel:command", message);138 return OnMessage(message);139 }).ConfigureAwait(false);140 var result = await tcs.Task.ConfigureAwait(false);141 if (typeof(T) == typeof(JsonElement?))142 {143 return (T)(object)result?.Clone();144 }145 else if (result == null)146 {147 return default;148 }149 else if (typeof(ChannelBase).IsAssignableFrom(typeof(T)) || typeof(ChannelBase[]).IsAssignableFrom(typeof(T)))150 {151 var enumerate = result.Value.EnumerateObject();152 return enumerate.Any()153 ? enumerate.FirstOrDefault().Value.ToObject<T>(DefaultJsonSerializerOptions)154 : default;155 }156 else157 {158 return result.Value.ToObject<T>(DefaultJsonSerializerOptions);159 }160 }161 internal IChannelOwner GetObject(string guid)162 {163 Objects.TryGetValue(guid, out var result);164 return result;165 }166 internal void MarkAsRemote() => IsRemote = true;167 internal Task<PlaywrightImpl> InitializePlaywrightAsync()168 {169 return _rootObject.InitializeAsync();170 }171 internal void OnObjectCreated(string guid, IChannelOwner result)172 {173 Objects.TryAdd(guid, result);174 }175 internal void Dispatch(PlaywrightServerMessage message)176 {177 if (message.Id.HasValue)178 {179 TraceMessage("pw:channel:response", message);180 if (_callbacks.TryRemove(message.Id.Value, out var callback))181 {182 if (message.Error != null)183 {184 callback.TaskCompletionSource.TrySetException(CreateException(message.Error.Error));185 }186 else187 {188 callback.TaskCompletionSource.TrySetResult(message.Result);189 }190 }191 return;192 }193 TraceMessage("pw:channel:event", message);194 try195 {196 if (message.Method == "__create__")197 {198 var createObjectInfo = message.Params.Value.ToObject<CreateObjectInfo>(DefaultJsonSerializerOptions);199 CreateRemoteObject(message.Guid, createObjectInfo.Type, createObjectInfo.Guid, createObjectInfo.Initializer);200 return;201 }202 if (message.Method == "__dispose__")203 {204 Objects.TryGetValue(message.Guid, out var disableObject);205 disableObject?.DisposeOwner();206 return;207 }208 Objects.TryGetValue(message.Guid, out var obj);209 obj?.Channel?.OnMessage(message.Method, message.Params);210 }211 catch (Exception ex)212 {213 DoClose(ex);214 }215 }216 private void CreateRemoteObject(string parentGuid, ChannelOwnerType type, string guid, JsonElement? initializer)217 {218 IChannelOwner result = null;219 var parent = string.IsNullOrEmpty(parentGuid) ? _rootObject : Objects[parentGuid];220#pragma warning disable CA2000 // Dispose objects before losing scope221 switch (type)222 {223 case ChannelOwnerType.Artifact:224 result = new Artifact(parent, guid, initializer?.ToObject<ArtifactInitializer>(DefaultJsonSerializerOptions));225 break;226 case ChannelOwnerType.BindingCall:227 result = new BindingCall(parent, guid, initializer?.ToObject<BindingCallInitializer>(DefaultJsonSerializerOptions));228 break;229 case ChannelOwnerType.Playwright:230 result = new PlaywrightImpl(parent, guid, initializer?.ToObject<PlaywrightInitializer>(DefaultJsonSerializerOptions));231 break;232 case ChannelOwnerType.Browser:233 var browserInitializer = initializer?.ToObject<BrowserInitializer>(DefaultJsonSerializerOptions);234 result = new Browser(parent, guid, browserInitializer);235 break;236 case ChannelOwnerType.BrowserType:237 var browserTypeInitializer = initializer?.ToObject<BrowserTypeInitializer>(DefaultJsonSerializerOptions);238 result = new Core.BrowserType(parent, guid, browserTypeInitializer);239 break;240 case ChannelOwnerType.BrowserContext:241 var browserContextInitializer = initializer?.ToObject<BrowserContextInitializer>(DefaultJsonSerializerOptions);242 result = new BrowserContext(parent, guid, browserContextInitializer);243 break;244 case ChannelOwnerType.ConsoleMessage:245 result = new ConsoleMessage(parent, guid, initializer?.ToObject<ConsoleMessageInitializer>(DefaultJsonSerializerOptions));246 break;247 case ChannelOwnerType.Dialog:248 result = new Dialog(parent, guid, initializer?.ToObject<DialogInitializer>(DefaultJsonSerializerOptions));249 break;250 case ChannelOwnerType.ElementHandle:251 result = new ElementHandle(parent, guid, initializer?.ToObject<ElementHandleInitializer>(DefaultJsonSerializerOptions));252 break;253 case ChannelOwnerType.Frame:254 result = new Frame(parent, guid, initializer?.ToObject<FrameInitializer>(DefaultJsonSerializerOptions));255 break;256 case ChannelOwnerType.JSHandle:257 result = new JSHandle(parent, guid, initializer?.ToObject<JSHandleInitializer>(DefaultJsonSerializerOptions));258 break;259 case ChannelOwnerType.JsonPipe:260 result = new JsonPipe(parent, guid, initializer?.ToObject<JsonPipeInitializer>(DefaultJsonSerializerOptions));261 break;262 case ChannelOwnerType.LocalUtils:263 result = new LocalUtils(parent, guid, initializer);264 break;265 case ChannelOwnerType.Page:266 result = new Page(parent, guid, initializer?.ToObject<PageInitializer>(DefaultJsonSerializerOptions));267 break;268 case ChannelOwnerType.Request:269 result = new Request(parent, guid, initializer?.ToObject<RequestInitializer>(DefaultJsonSerializerOptions));270 break;271 case ChannelOwnerType.Response:272 result = new Response(parent, guid, initializer?.ToObject<ResponseInitializer>(DefaultJsonSerializerOptions));273 break;274 case ChannelOwnerType.Route:275 result = new Route(parent, guid, initializer?.ToObject<RouteInitializer>(DefaultJsonSerializerOptions));276 break;277 case ChannelOwnerType.Worker:278 result = new Worker(parent, guid, initializer?.ToObject<WorkerInitializer>(DefaultJsonSerializerOptions));279 break;280 case ChannelOwnerType.WebSocket:281 result = new WebSocket(parent, guid, initializer?.ToObject<WebSocketInitializer>(DefaultJsonSerializerOptions));282 break;283 case ChannelOwnerType.Selectors:284 result = new Selectors(parent, guid);285 break;286 case ChannelOwnerType.SocksSupport:287 result = new SocksSupport(parent, guid);288 break;289 case ChannelOwnerType.Stream:290 result = new Stream(parent, guid);291 break;292 case ChannelOwnerType.WritableStream:293 result = new WritableStream(parent, guid);294 break;295 case ChannelOwnerType.Tracing:296 result = new Tracing(parent, guid);297 break;298 default:299 TraceMessage("pw:dotnet", "Missing type " + type);300 break;301 }302#pragma warning restore CA2000303 Objects.TryAdd(guid, result);304 OnObjectCreated(guid, result);305 }306 private void DoClose(Exception ex)307 {308 TraceMessage("pw:dotnet", $"Connection Close: {ex.Message}\n{ex.StackTrace}");309 DoClose(ex.Message);310 }311 internal void DoClose(string reason)312 {313 _reason = string.IsNullOrEmpty(_reason) ? reason : _reason;314 if (!IsClosed)315 {316 foreach (var callback in _callbacks)317 {318 callback.Value.TaskCompletionSource.TrySetException(new PlaywrightException(reason));319 }320 Dispose();321 IsClosed = true;322 }323 }324 private Exception CreateException(PlaywrightServerError error)325 {326 if (string.IsNullOrEmpty(error.Message))327 {328 return new PlaywrightException(error.Value);329 }330 if (error.Name == "TimeoutError")331 {332 return new TimeoutException(error.Message);333 }334 return new PlaywrightException(error.Message);335 }336 private void Dispose(bool disposing)337 {338 if (!disposing)339 {340 return;341 }342 _queue.Dispose();343 Close.Invoke(this, "Connection disposed");344 }345 [Conditional("DEBUG")]346 internal void TraceMessage(string logLevel, object message)347 {348 string actualLogLevel = Environment.GetEnvironmentVariable("DEBUG");349 if (!string.IsNullOrEmpty(actualLogLevel))350 {351 if (!actualLogLevel.Contains(logLevel))352 {353 return;354 }355 if (!(message is string))356 {357 message = JsonSerializer.Serialize(message, DefaultJsonSerializerOptions);358 }359 string line = $"{logLevel}: {message}";360 Trace.WriteLine(line);361 Console.Error.WriteLine(line);362 }363 }364 internal async Task<T> WrapApiCallAsync<T>(Func<Task<T>> action, bool isInternal = false)365 {366 EnsureApiZoneExists();367 if (ApiZone.Value[0] != null)368 {369 return await action().ConfigureAwait(false);370 }371 var st = new StackTrace(true);372 var stack = new List<object>();373 var lastInternalApiName = string.Empty;374 var apiName = string.Empty;375 for (int i = 0; i < st.FrameCount; ++i)376 {377 var sf = st.GetFrame(i);378 string fileName = sf.GetFileName();379 string cSharpNamespace = sf.GetMethod().ReflectedType?.Namespace;380 bool playwrightInternal = cSharpNamespace != null &&381 (cSharpNamespace == "Microsoft.Playwright" ||382 cSharpNamespace.StartsWith("Microsoft.Playwright.Core", StringComparison.InvariantCultureIgnoreCase) ||383 cSharpNamespace.StartsWith("Microsoft.Playwright.Transport", StringComparison.InvariantCultureIgnoreCase) ||384 cSharpNamespace.StartsWith("Microsoft.Playwright.Helpers", StringComparison.InvariantCultureIgnoreCase));385 if (string.IsNullOrEmpty(fileName) && !playwrightInternal)386 {387 continue;388 }389 if (!playwrightInternal)390 {391 stack.Add(new { file = fileName, line = sf.GetFileLineNumber(), column = sf.GetFileColumnNumber() });392 }393 string methodName = $"{sf?.GetMethod()?.DeclaringType?.Name}.{sf?.GetMethod()?.Name}";394 if (methodName.Contains("WrapApiBoundaryAsync"))395 {396 break;397 }398 if (methodName.StartsWith("<", StringComparison.InvariantCultureIgnoreCase))399 {400 continue;401 }402 if (playwrightInternal)403 {404 lastInternalApiName = methodName;405 }406 else if (!string.IsNullOrEmpty(lastInternalApiName))407 {408 apiName = lastInternalApiName;409 lastInternalApiName = string.Empty;410 }411 }412 if (string.IsNullOrEmpty(apiName))413 {414 apiName = lastInternalApiName;415 }416 try417 {418 if (!string.IsNullOrEmpty(apiName))419 {420 ApiZone.Value[0] = new() { ApiName = apiName, Stack = stack, IsInternal = isInternal };421 }422 return await action().ConfigureAwait(false);423 }424 finally425 {426 ApiZone.Value[0] = null;427 }428 }429 internal async Task WrapApiBoundaryAsync(Func<Task> action)430 {431 EnsureApiZoneExists();432 try433 {434 ApiZone.Value.Insert(0, null);435 await action().ConfigureAwait(false);436 }437 finally438 {439 ApiZone.Value.RemoveAt(0);440 }441 }442 private void EnsureApiZoneExists()443 {444 if (ApiZone.Value == null)445 {446 ApiZone.Value = new() { null };447 }448 }449 }450}...
ElementHandleChannel.cs
Source:ElementHandleChannel.cs
...38 {39 Object = owner;40 }41 internal event EventHandler<PreviewUpdatedEventArgs> PreviewUpdated;42 public new ElementHandle Object { get; set; }43 internal override void OnMessage(string method, JsonElement? serverParams)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 {288 args["elements"] = values;289 }290 else291 {292 args["options"] = values;293 }294 args["force"] = force;295 args["timeout"] = timeout;296 args["noWaitAfter"] = noWaitAfter;297 return (await Connection.SendMessageToServerAsync(Guid, "selectOption", args).ConfigureAwait(false))?.GetProperty("values").ToObject<List<string>>().AsReadOnly();298 }299 internal async Task<bool> IsVisibleAsync()300 => (await Connection.SendMessageToServerAsync(Guid, "isVisible", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default;301 internal async Task<bool> IsHiddenAsync()302 => (await Connection.SendMessageToServerAsync(Guid, "isHidden", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default;303 internal async Task<bool> IsEnabledAsync()304 => (await Connection.SendMessageToServerAsync(Guid, "isEnabled", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default;305 internal async Task<bool> IsEditableAsync()306 => (await Connection.SendMessageToServerAsync(Guid, "isEditable", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default;307 internal async Task<bool> IsDisabledAsync()308 => (await Connection.SendMessageToServerAsync(Guid, "isDisabled", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default;309 internal async Task<string> InputValueAsync(float? timeout)310 {311 var args = new Dictionary<string, object>()312 {313 { "timeout", timeout },314 };315 return (await Connection.SendMessageToServerAsync(Guid, "inputValue", args).ConfigureAwait(false))?.GetProperty("value").GetString();316 }317 internal async Task<bool> IsCheckedAsync()318 => (await Connection.SendMessageToServerAsync(Guid, "isChecked", null).ConfigureAwait(false))?.GetProperty("value").GetBoolean() ?? default;319 internal Task CheckAsync(Position position, float? timeout, bool? force, bool? noWaitAfter, bool? trial)320 {321 var args = new Dictionary<string, object>322 {323 ["force"] = force,324 ["position"] = position,325 ["trial"] = trial,326 ["timeout"] = timeout,327 ["noWaitAfter"] = noWaitAfter,328 };329 return Connection.SendMessageToServerAsync<ElementHandleChannel>(Guid, "check", args);330 }331 internal Task UncheckAsync(Position position, float? timeout, bool? force, bool? noWaitAfter, bool? trial)332 {333 var args = new Dictionary<string, object>334 {335 ["force"] = force,336 ["position"] = position,337 ["trial"] = trial,338 ["timeout"] = timeout,339 ["noWaitAfter"] = noWaitAfter,340 };341 return Connection.SendMessageToServerAsync<ElementHandleChannel>(Guid, "uncheck", args);342 }343 internal Task TypeAsync(string text, float? delay, float? timeout, bool? noWaitAfter)344 {345 var args = new Dictionary<string, object>346 {347 ["text"] = text,348 ["delay"] = delay,349 ["timeout"] = timeout,350 ["noWaitAfter"] = noWaitAfter,351 };352 return Connection.SendMessageToServerAsync(Guid, "type", args);353 }354 internal Task PressAsync(string key, float? delay, float? timeout, bool? noWaitAfter)355 {356 var args = new Dictionary<string, object>357 {358 ["key"] = key,359 ["delay"] = delay,360 ["timeout"] = timeout,361 ["noWaitAfter"] = noWaitAfter,362 };363 return Connection.SendMessageToServerAsync(Guid, "press", args);364 }365 internal Task TapAsync(366 Position position,367 IEnumerable<KeyboardModifier> modifiers,368 float? timeout,369 bool? force,370 bool? noWaitAfter,371 bool? trial)372 {373 var args = new Dictionary<string, object>374 {375 ["force"] = force,376 ["noWaitAfter"] = noWaitAfter,377 ["position"] = position,378 ["modifiers"] = modifiers?.Select(m => m.ToValueString()),379 ["trial"] = trial,380 ["timeout"] = timeout,381 };382 return Connection.SendMessageToServerAsync(Guid, "tap", args);383 }384 }385}...
BrowserContextChannel.cs
Source:BrowserContextChannel.cs
...55 break;56 case "bindingCall":57 BindingCall?.Invoke(58 this,59 new() { BindingCall = serverParams?.GetProperty("binding").ToObject<BindingCallChannel>(Connection.DefaultJsonSerializerOptions).Object });60 break;61 case "route":62 var route = serverParams?.GetProperty("route").ToObject<RouteChannel>(Connection.DefaultJsonSerializerOptions).Object;63 var request = serverParams?.GetProperty("request").ToObject<RequestChannel>(Connection.DefaultJsonSerializerOptions).Object;64 Route?.Invoke(65 this,66 new() { Route = route, Request = request });67 break;68 case "page":69 Page?.Invoke(70 this,71 new() { PageChannel = serverParams?.GetProperty("page").ToObject<PageChannel>(Connection.DefaultJsonSerializerOptions) });72 break;73 case "crBackgroundPage":74 BackgroundPage?.Invoke(75 this,76 new() { PageChannel = serverParams?.GetProperty("page").ToObject<PageChannel>(Connection.DefaultJsonSerializerOptions) });77 break;78 case "crServiceWorker":79 ServiceWorker?.Invoke(80 this,81 new() { WorkerChannel = serverParams?.GetProperty("worker").ToObject<WorkerChannel>(Connection.DefaultJsonSerializerOptions) });82 break;83 case "request":84 Request?.Invoke(this, serverParams?.ToObject<BrowserContextChannelRequestEventArgs>(Connection.DefaultJsonSerializerOptions));85 break;86 case "requestFinished":87 RequestFinished?.Invoke(this, serverParams?.ToObject<BrowserContextChannelRequestEventArgs>(Connection.DefaultJsonSerializerOptions));88 break;89 case "requestFailed":90 RequestFailed?.Invoke(this, serverParams?.ToObject<BrowserContextChannelRequestEventArgs>(Connection.DefaultJsonSerializerOptions));91 break;92 case "response":93 Response?.Invoke(this, serverParams?.ToObject<BrowserContextChannelResponseEventArgs>(Connection.DefaultJsonSerializerOptions));94 break;95 }96 }97 internal Task<PageChannel> NewPageAsync()98 => Connection.SendMessageToServerAsync<PageChannel>(99 Guid,100 "newPage",101 null);102 internal Task CloseAsync() => Connection.SendMessageToServerAsync(Guid, "close");103 internal Task PauseAsync()104 => Connection.SendMessageToServerAsync(Guid, "pause", null);105 internal Task SetDefaultNavigationTimeoutNoReplyAsync(float timeout)106 => Connection.SendMessageToServerAsync<PageChannel>(107 Guid,108 "setDefaultNavigationTimeoutNoReply",109 new Dictionary<string, object>110 {111 ["timeout"] = timeout,112 });113 internal Task SetDefaultTimeoutNoReplyAsync(float timeout)114 => Connection.SendMessageToServerAsync<PageChannel>(115 Guid,116 "setDefaultTimeoutNoReply",117 new Dictionary<string, object>118 {119 ["timeout"] = timeout,120 });121 internal Task ExposeBindingAsync(string name, bool needsHandle)122 => Connection.SendMessageToServerAsync<PageChannel>(123 Guid,124 "exposeBinding",125 new Dictionary<string, object>126 {127 ["name"] = name,128 ["needsHandle"] = needsHandle,129 });130 internal Task AddInitScriptAsync(string script)131 => Connection.SendMessageToServerAsync<PageChannel>(132 Guid,133 "addInitScript",134 new Dictionary<string, object>135 {136 ["source"] = script,137 });138 internal Task SetNetworkInterceptionEnabledAsync(bool enabled)139 => Connection.SendMessageToServerAsync<PageChannel>(140 Guid,141 "setNetworkInterceptionEnabled",142 new Dictionary<string, object>143 {144 ["enabled"] = enabled,145 });146 internal Task SetOfflineAsync(bool offline)147 => Connection.SendMessageToServerAsync<PageChannel>(148 Guid,149 "setOffline",150 new Dictionary<string, object>151 {152 ["offline"] = offline,153 });154 internal async Task<IReadOnlyList<BrowserContextCookiesResult>> CookiesAsync(IEnumerable<string> urls)155 {156 return (await Connection.SendMessageToServerAsync(157 Guid,158 "cookies",159 new Dictionary<string, object>160 {161 ["urls"] = urls?.ToArray() ?? Array.Empty<string>(),162 }).ConfigureAwait(false))?.GetProperty("cookies").ToObject<IReadOnlyList<BrowserContextCookiesResult>>();163 }164 internal Task AddCookiesAsync(IEnumerable<Cookie> cookies)165 => Connection.SendMessageToServerAsync<PageChannel>(166 Guid,167 "addCookies",168 new Dictionary<string, object>169 {170 ["cookies"] = cookies,171 });172 internal Task GrantPermissionsAsync(IEnumerable<string> permissions, string origin)173 {174 var args = new Dictionary<string, object>175 {176 ["permissions"] = permissions?.ToArray(),177 };178 if (origin != null)179 {180 args["origin"] = origin;181 }182 return Connection.SendMessageToServerAsync<PageChannel>(Guid, "grantPermissions", args);183 }184 internal Task ClearPermissionsAsync() => Connection.SendMessageToServerAsync<PageChannel>(Guid, "clearPermissions", null);185 internal Task SetGeolocationAsync(Geolocation geolocation)186 => Connection.SendMessageToServerAsync<PageChannel>(187 Guid,188 "setGeolocation",189 new Dictionary<string, object>190 {191 ["geolocation"] = geolocation,192 });193 internal Task ClearCookiesAsync() => Connection.SendMessageToServerAsync<PageChannel>(Guid, "clearCookies", null);194 internal Task SetExtraHTTPHeadersAsync(IEnumerable<KeyValuePair<string, string>> headers)195 => Connection.SendMessageToServerAsync(196 Guid,197 "setExtraHTTPHeaders",198 new Dictionary<string, object>199 {200 ["headers"] = headers.Select(kv => new HeaderEntry { Name = kv.Key, Value = kv.Value }),201 });202 internal Task<StorageState> GetStorageStateAsync()203 => Connection.SendMessageToServerAsync<StorageState>(Guid, "storageState", null);204 internal async Task<Artifact> HarExportAsync()205 {206 var result = await Connection.SendMessageToServerAsync(207 Guid,208 "harExport").ConfigureAwait(false);209 return result.GetObject<Artifact>("artifact", Connection);210 }211 internal async Task<WritableStream> CreateTempFileAsync(string name)212 {213 var channelArgs = new Dictionary<string, object>214 {215 { "name", name },216 };217 var result = await Connection.SendMessageToServerAsync(Guid, "createTempFile", channelArgs).ConfigureAwait(false);218 return result.GetObject<WritableStream>("writableStream", Connection);219 }220 }221}...
WritableStream.cs
Source:WritableStream.cs
...32 internal class WritableStream : ChannelOwnerBase, IChannelOwner<WritableStream>, IAsyncDisposable33 {34 internal WritableStream(IChannelOwner parent, string guid) : base(parent, guid)35 {36 Channel = new(guid, parent.Connection, this);37 }38 ChannelBase IChannelOwner.Channel => Channel;39 IChannel<WritableStream> IChannelOwner<WritableStream>.Channel => Channel;40 public WritableStreamChannel Channel { get; }41 public WritableStreamImpl WritableStreamImpl => new(this);42 public Task WriteAsync(string binary) => Channel.WriteAsync(binary);43 public ValueTask DisposeAsync() => new ValueTask(CloseAsync());44 public Task CloseAsync() => Channel.CloseAsync();45 }46 internal class WritableStreamImpl : System.IO.Stream47 {48 private readonly WritableStream _stream;49 internal WritableStreamImpl(WritableStream stream)50 {51 _stream = stream;52 }53 public override bool CanRead => throw new NotImplementedException();54 public override bool CanSeek => throw new NotImplementedException();55 public override bool CanWrite => true;56 public override long Length => throw new NotImplementedException();57 public override long Position { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }58 public override void Flush() => throw new NotImplementedException();59 public override int Read(byte[] buffer, int offset, int count) => throw new NotImplementedException();60 public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) =>61 throw new NotImplementedException();62 public override void Close() => _stream.CloseAsync().ConfigureAwait(false);63 public override long Seek(long offset, SeekOrigin origin) => throw new NotImplementedException();64 public override void SetLength(long value) => throw new NotImplementedException();65 public override void Write(byte[] buffer, int offset, int count) => throw new NotImplementedException();66 public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)67 {68 await this._stream.WriteAsync(Convert.ToBase64String(buffer)).ConfigureAwait(false);69 }70 }71}...
WritableStreamChannel.cs
Source:WritableStreamChannel.cs
...35 {36 await Connection.SendMessageToServerAsync(37 Guid,38 "write",39 new Dictionary<string, object>40 {41 ["binary"] = binary,42 }).ConfigureAwait(false);43 }44 internal Task CloseAsync() => Connection.SendMessageToServerAsync(Guid, "close", null);45 }46}...
new
Using AI Code Generation
1using Microsoft.Playwright.Core;2using System;3using System.Threading.Tasks;4{5 {6 static async Task Main(string[] args)7 {8 var playwright = await Playwright.CreateAsync();9 var browser = await playwright.Chromium.LaunchAsync();10 var context = await browser.NewContextAsync();11 var page = await context.NewPageAsync();12 var stream = new WritableStream();13 var writer = stream.GetWriter();14 await writer.WriteAsync("Hello World");15 await writer.CloseAsync();16 await page.SetContentAsync(stream);17 await browser.CloseAsync();18 }19 }20}21using Microsoft.Playwright.Core;22using System;23using System.Threading.Tasks;24{25 {26 static async Task Main(string[] args)27 {28 var playwright = await Playwright.CreateAsync();29 var browser = await playwright.Chromium.LaunchAsync();30 var context = await browser.NewContextAsync();31 var page = await context.NewPageAsync();32 var stream = new WritableStream();33 var writer = stream.GetWriter();34 await writer.WriteAsync("Hello World");35 await writer.CloseAsync();36 await page.SetContentAsync(stream);37 await browser.CloseAsync();38 }39 }40}41using Microsoft.Playwright.Core;42using System;43using System.Threading.Tasks;44{45 {46 static async Task Main(string[] args)47 {48 var playwright = await Playwright.CreateAsync();49 var browser = await playwright.Chromium.LaunchAsync();50 var context = await browser.NewContextAsync();51 var page = await context.NewPageAsync();52 var stream = new WritableStream();53 var writer = stream.GetWriter();54 await writer.WriteAsync("Hello World");55 await writer.CloseAsync();56 await page.SetContentAsync(stream);57 await browser.CloseAsync();58 }59 }60}61using Microsoft.Playwright.Core;62using System;63using System.Threading.Tasks;64{65 {66 static async Task Main(string[] args)67 {
new
Using AI Code Generation
1var browser = await Playwright.CreateAsync().Chromium.LaunchAsync();2var page = await browser.NewPageAsync();3var stream = await response.BodyAsync();4var buffer = new byte[1000];5var bytesRead = await stream.ReadAsync(buffer);6Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, bytesRead));7await browser.CloseAsync();8var browser = await Playwright.CreateAsync().Chromium.LaunchAsync();9var page = await browser.NewPageAsync();10var stream = await response.BodyAsync();11var buffer = new byte[1000];12var bytesRead = await stream.ReadAsync(buffer);13Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, bytesRead));14await browser.CloseAsync();15var browser = await Playwright.CreateAsync().Chromium.LaunchAsync();16var page = await browser.NewPageAsync();17var stream = await response.BodyAsync();18var buffer = new byte[1000];19var bytesRead = await stream.ReadAsync(buffer);20Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, bytesRead));21await browser.CloseAsync();22var browser = await Playwright.CreateAsync().Chromium.LaunchAsync();23var page = await browser.NewPageAsync();24var stream = await response.BodyAsync();25var buffer = new byte[1000];26var bytesRead = await stream.ReadAsync(buffer);27Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, bytesRead));28await browser.CloseAsync();29var browser = await Playwright.CreateAsync().Chromium.LaunchAsync();30var page = await browser.NewPageAsync();
new
Using AI Code Generation
1var stream = await page.EvaluateAsync<Microsoft.Playwright.Core.WritableStream>("() => new WritableStream()");2await stream.WriteAsync("Hello World");3await stream.CloseAsync();4var stream = await page.EvaluateAsync<Microsoft.Playwright.Core.WritableStream>("() => new WritableStream()");5await stream.WriteAsync("Hello World");6await stream.CloseAsync();7var stream = await page.EvaluateAsync<Microsoft.Playwright.Core.WritableStream>("() => new WritableStream()");8await stream.WriteAsync("Hello World");9await stream.CloseAsync();10var stream = await page.EvaluateAsync<Microsoft.Playwright.Core.WritableStream>("() => new WritableStream()");11await stream.WriteAsync("Hello World");12await stream.CloseAsync();13var stream = await page.EvaluateAsync<Microsoft.Playwright.Core.WritableStream>("() => new WritableStream()");14await stream.WriteAsync("Hello World");15await stream.CloseAsync();16var stream = await page.EvaluateAsync<Microsoft.Playwright.Core.WritableStream>("() => new WritableStream()");17await stream.WriteAsync("Hello World");18await stream.CloseAsync();19var stream = await page.EvaluateAsync<Microsoft.Playwright.Core.WritableStream>("() => new WritableStream()");20await stream.WriteAsync("Hello World");21await stream.CloseAsync();22var stream = await page.EvaluateAsync<Microsoft.Playwright.Core.WritableStream>("() => new WritableStream()");23await stream.WriteAsync("Hello World");24await stream.CloseAsync();25var stream = await page.EvaluateAsync<Microsoft.Playwright.Core.WritableStream>("() => new WritableStream()");
new
Using AI Code Generation
1using Microsoft.Playwright.Core;2var ws = new WritableStream();3await ws.WriteAsync(new byte[] { 1, 2, 3, 4 });4using Microsoft.Playwright.Core;5var rs = new ReadableStream();6var buffer = await rs.ReadAsync();7using Microsoft.Playwright.Core;8var s = new Stream();9var buffer = await s.ReadAsync();10var ws = new WritableStream();11await ws.WriteAsync(new byte[] { 1, 2, 3, 4 });12using Microsoft.Playwright.Core;13var browser = await Playwright.CreateAsync();14var context = await browser.NewContextAsync();15await context.GrantPermissionsAsync(new string[] { "geolocation" });16await context.ClearPermissionsAsync();17using Microsoft.Playwright.Core;18var browser = await Playwright.CreateAsync();19var version = browser.Version;20using Microsoft.Playwright.Core;21var browser = await Playwright.CreateAsync();22var context = await browser.NewContextAsync();23var page = await context.NewPageAsync();24var cookies = await page.Context.CookiesAsync();25await page.Context.AddCookiesAsync(new CookieParam[] { new CookieParam() { Name = "cookie1", Value = "value1" }, new CookieParam() { Name = "cookie2", Value = "value2" } });26await page.Context.ClearCookiesAsync();27using Microsoft.Playwright.Core;28var browser = await Playwright.CreateAsync();29var context = await browser.NewContextAsync();30var page = await context.NewPageAsync();31var element = await page.Frame.FocuseAsync("#selector");32using Microsoft.Playwright.Core;33var browser = await Playwright.CreateAsync();34var context = await browser.NewContextAsync();35var page = await context.NewPageAsync();36var element = await page.QuerySelectorAsync("#selector");37var boundingBox = await element.BoundingBoxAsync();38var screenshot = await element.ScreenshotAsync();39var elementHandle = await element.QuerySelectorAsync("#selector");
new
Using AI Code Generation
1using Microsoft.Playwright;2using System;3using System.Threading.Tasks;4{5 {6 public static async Task Main(string[] args)7 {8 var chromiumExecutablePath = @"C:\Users\user\Downloads\chromium-888113\chrome-win\chrome.exe";9 var playwrightExecutablePath = @"C:\Users\user\Downloads\playwright-1.4.2-win\playwright.cmd";10 var playwright = await Playwright.CreateAsync(playwrightExecutablePath);11 var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions12 {13 });14 var page = await browser.NewPageAsync();15 await page.ClickAsync("text=Sign in");16 await page.FillAsync("input[name=\"identifier\"]", "
new
Using AI Code Generation
1var stream = await Page.CreateWritableStreamAsync();2await stream.CloseAsync();3var stream = await Page.CreateWritableStreamAsync();4await stream.CloseAsync();5var stream = await Page.CreateWritableStreamAsync();6await stream.CloseAsync();7var stream = await Page.CreateWritableStreamAsync();8await stream.CloseAsync();9var stream = await Page.CreateWritableStreamAsync();10await stream.CloseAsync();11var stream = await Page.CreateWritableStreamAsync();12await stream.CloseAsync();13var stream = await Page.CreateWritableStreamAsync();14await stream.CloseAsync();15var stream = await Page.CreateWritableStreamAsync();
new
Using AI Code Generation
1await using var fs = File.Create("test.txt");2var ws = new WritableStream(fs);3await ws.WriteAsync("Hello World");4await ws.CloseAsync();5var rs = new ReadableStream(File.OpenRead("test.txt"));6var buffer = new byte[1024];7var bytesRead = rs.Read(buffer, 0, 1024);8Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, bytesRead));9await using var fs = File.Create("test.txt");10var ws = new WritableStream(fs);11await ws.WriteAsync("Hello World");12await ws.CloseAsync();13var rs = new ReadableStream(File.OpenRead("test.txt"));14var buffer = new byte[1024];15var bytesRead = rs.Read(buffer, 0, 1024);16Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, bytesRead));17await using var fs = File.Create("test.txt");18var ws = new WritableStream(fs);19await ws.WriteAsync("Hello World");20await ws.CloseAsync();21var rs = new ReadableStream(File.OpenRead("test.txt"));22var buffer = new byte[1024];23var bytesRead = rs.Read(buffer, 0, 1024);24Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, bytesRead));25await using var fs = File.Create("test.txt");26var ws = new WritableStream(fs);27await ws.WriteAsync("Hello World");28await ws.CloseAsync();29var rs = new ReadableStream(File.OpenRead("
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!!