/// <summary> /// Execute a method call over the DevTools protocol. This is a more structured /// version of SendDevToolsMessage. /// See the DevTools protocol documentation at https://chromedevtools.github.io/devtools-protocol/ for details /// of supported methods and the expected <paramref name="paramsAsJson"/> dictionary contents. /// See the SendDevToolsMessage documentation for additional usage information. /// </summary> /// <param name="messageId">is an incremental number that uniquely identifies the message (pass 0 to have the next number assigned /// automatically based on previous values)</param> /// <param name="method">is the method name</param> /// <param name="parameters">are the method parameters represented as a <see cref="JsonString"/>, /// which may be empty.</param> /// <returns>return the assigned message Id if called on the CEF UI thread and the message was /// successfully submitted for validation, otherwise 0</returns> public static int ExecuteDevToolsMethod(this IBrowserHost browserHost, int messageId, string method, JsonString parameters) { WebBrowserExtensions.ThrowExceptionIfBrowserHostNull(browserHost); var json = parameters == null ? null : parameters.Json; return(browserHost.ExecuteDevToolsMethod(messageId, method, json)); }
/// <summary> /// Gets a new Instance of the DevTools client /// </summary> /// <param name="browser">the IBrowser instance</param> /// <returns>DevToolsClient</returns> public static DevToolsClient GetDevToolsClient(this IBrowser browser) { var browserHost = browser.GetHost(); WebBrowserExtensions.ThrowExceptionIfBrowserHostNull(browserHost); var devToolsClient = new DevToolsClient(browser); var observerRegistration = browserHost.AddDevToolsMessageObserver(devToolsClient); devToolsClient.SetDevToolsObserverRegistration(observerRegistration); return(devToolsClient); }
/// <summary> /// Set the Document Content for the Main Frame using DevTools Protocol. /// </summary> /// <param name="browser">the browser instance</param> /// <param name="html">html</param> /// <returns>Task that can be awaited to determine if the content was successfully updated.</returns> public static async Task <bool> SetMainFrameDocumentContentAsync(this IBrowser browser, string html) { WebBrowserExtensions.ThrowExceptionIfBrowserNull(browser); using (var client = browser.GetDevToolsClient()) { var response = await client.Page.GetFrameTreeAsync().ConfigureAwait(false); var frames = response.FrameTree; var mainFrame = frames.Frame; var setContentResponse = await client.Page.SetDocumentContentAsync(mainFrame.Id, html).ConfigureAwait(false); return(setContentResponse.Success); } }
/// <summary> /// Execute a method call over the DevTools protocol. This is a more structured /// version of SendDevToolsMessage. <see cref="ExecuteDevToolsMethod"/> can only be called on the /// CEF UI Thread, this method can be called on any thread. /// See the DevTools protocol documentation at https://chromedevtools.github.io/devtools-protocol/ for details /// of supported methods and the expected <paramref name="parameters"/> dictionary contents. /// See the SendDevToolsMessage documentation for additional usage information. /// </summary> /// <param name="browser">the browser instance</param> /// <param name="messageId">is an incremental number that uniquely identifies the message (pass 0 to have the next number assigned /// automatically based on previous values)</param> /// <param name="method">is the method name</param> /// <param name="parameters">are the method parameters represented as a dictionary, /// which may be empty.</param> /// <returns>return a Task that can be awaited to obtain the assigned message Id. If the message was /// unsuccessfully submitted for validation, this value will be 0.</returns> public static Task <int> ExecuteDevToolsMethodAsync(this IBrowser browser, int messageId, string method, IDictionary <string, object> parameters = null) { WebBrowserExtensions.ThrowExceptionIfBrowserNull(browser); var browserHost = browser.GetHost(); WebBrowserExtensions.ThrowExceptionIfBrowserHostNull(browserHost); if (CefThread.CurrentlyOnUiThread) { return(Task.FromResult(browserHost.ExecuteDevToolsMethod(messageId, method, parameters))); } if (CefThread.CanExecuteOnUiThread) { return(CefThread.ExecuteOnUiThread(() => { return browserHost.ExecuteDevToolsMethod(messageId, method, parameters); })); } //CEF returns 0 to signify failure, we'll do the same. return(Task.FromResult(0)); }