How to use new method of Microsoft.Playwright.Core.WritableStream class

Best Playwright-dotnet code snippet using Microsoft.Playwright.Core.WritableStream.new

FrameChannel.cs

Source:FrameChannel.cs Github

copy

Full Screen

...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}...

Full Screen

Full Screen

Connection.cs

Source:Connection.cs Github

copy

Full Screen

...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}...

Full Screen

Full Screen

ElementHandleChannel.cs

Source:ElementHandleChannel.cs Github

copy

Full Screen

...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}...

Full Screen

Full Screen

BrowserContextChannel.cs

Source:BrowserContextChannel.cs Github

copy

Full Screen

...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}...

Full Screen

Full Screen

WritableStream.cs

Source:WritableStream.cs Github

copy

Full Screen

...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}...

Full Screen

Full Screen

WritableStreamChannel.cs

Source:WritableStreamChannel.cs Github

copy

Full Screen

...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}...

Full Screen

Full Screen

new

Using AI Code Generation

copy

Full Screen

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 {

Full Screen

Full Screen

new

Using AI Code Generation

copy

Full Screen

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();

Full Screen

Full Screen

new

Using AI Code Generation

copy

Full Screen

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()");

Full Screen

Full Screen

new

Using AI Code Generation

copy

Full Screen

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");

Full Screen

Full Screen

new

Using AI Code Generation

copy

Full Screen

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\"]", "

Full Screen

Full Screen

new

Using AI Code Generation

copy

Full Screen

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();

Full Screen

Full Screen

new

Using AI Code Generation

copy

Full Screen

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("

Full Screen

Full Screen

Playwright tutorial

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.

Chapters:

  1. What is Playwright : Playwright is comparatively new but has gained good popularity. Get to know some history of the Playwright with some interesting facts connected with it.
  2. How To Install Playwright : Learn in detail about what basic configuration and dependencies are required for installing Playwright and run a test. Get a step-by-step direction for installing the Playwright automation framework.
  3. Playwright Futuristic Features: Launched in 2020, Playwright gained huge popularity quickly because of some obliging features such as Playwright Test Generator and Inspector, Playwright Reporter, Playwright auto-waiting mechanism and etc. Read up on those features to master Playwright testing.
  4. What is Component Testing: Component testing in Playwright is a unique feature that allows a tester to test a single component of a web application without integrating them with other elements. Learn how to perform Component testing on the Playwright automation framework.
  5. Inputs And Buttons In Playwright: Every website has Input boxes and buttons; learn about testing inputs and buttons with different scenarios and examples.
  6. Functions and Selectors in Playwright: Learn how to launch the Chromium browser with Playwright. Also, gain a better understanding of some important functions like “BrowserContext,” which allows you to run multiple browser sessions, and “newPage” which interacts with a page.
  7. Handling Alerts and Dropdowns in Playwright : Playwright interact with different types of alerts and pop-ups, such as simple, confirmation, and prompt, and different types of dropdowns, such as single selector and multi-selector get your hands-on with handling alerts and dropdown in Playright testing.
  8. Playwright vs Puppeteer: Get to know about the difference between two testing frameworks and how they are different than one another, which browsers they support, and what features they provide.
  9. Run Playwright Tests on LambdaTest: Playwright testing with LambdaTest leverages test performance to the utmost. You can run multiple Playwright tests in Parallel with the LammbdaTest test cloud. Get a step-by-step guide to run your Playwright test on the LambdaTest platform.
  10. Playwright Python Tutorial: Playwright automation framework support all major languages such as Python, JavaScript, TypeScript, .NET and etc. However, there are various advantages to Python end-to-end testing with Playwright because of its versatile utility. Get the hang of Playwright python testing with this chapter.
  11. Playwright End To End Testing Tutorial: Get your hands on with Playwright end-to-end testing and learn to use some exciting features such as TraceViewer, Debugging, Networking, Component testing, Visual testing, and many more.
  12. Playwright Video Tutorial: Watch the video tutorials on Playwright testing from experts and get a consecutive in-depth explanation of Playwright automation testing.

Run Playwright-dotnet automation tests on LambdaTest cloud grid

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

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful