1

CefSharp Version: 86.0.241.0
.Net Framework 4.5.2
I am new to C# and my English is not good. Sorry.... Try a variety of methods to implement:

private void button18_Click(object sender, EventArgs e)
{
    //1
    DevToolsClient devTool = chromiumWebBrowser1.GetBrowser().GetDevToolsClient();
    devTool.ExecuteDevToolsMethodAsync("Browser.getVersion").Wait();// stuck
    
    //2
    DevToolsClient dev = DevToolsExtensions.GetDevToolsClient(chromiumWebBrowser1);
    dev.ExecuteDevToolsMethodAsync("Browser.getVersion").Wait();// stuck
    
}
// load complete after:
chromiumWebBrowser1.FrameLoadEnd += new EventHandler<FrameLoadEndEventArgs>(new Action<object, FrameLoadEndEventArgs>((s, ea) => {
    IBrowser browser = chromiumWebBrowser1.GetBrowser();
    DevToolsClient devTool = chromiumWebBrowser1.GetBrowser().GetDevToolsClient();
    //devTool.Browser.GetVersionAsync().Wait();      //execute nomal
    devTool.DOM.GetDocumentAsync().Wait();  // stuck
}));
//
private void button1_Click(object sender, EventArgs e)
{
    DevToolsClient devTool = chromiumWebBrowser1.GetBrowser().GetDevToolsClient();
    //devTool.Page.ReloadAsync();  //nomal  page reload
    devTool.Page.ReloadAsync().Wait(); // stuck
}

In addition to being successful Browser.GetVersionAsync() in FrameLoadEnd event .

2 Answers2

2

A solution has been found! use async/await solve.

private async void button1_Click(object sender, EventArgs e)
{
    DevToolsClient devTool = chromiumWebBrowser1.GetBrowser().GetDevToolsClient();
    DevToolsMethodResponse resp = await devTool.ExecuteDevToolsMethodAsync("DOM.getDocument");
    Console.WriteLine(resp.ResponseAsJsonString);
}
  • Well done ! some explanation can be found here https://stackoverflow.com/questions/13140523/await-vs-task-wait-deadlock – Goodies Jan 26 '21 at 08:34
0

The final solution:

//global variable
DevToolsClient devTool = null;
//Should be obtained at initialization time DevToolsClient,And only get it once
//Each call to GetDevToolsClient() messageId resets
chromiumWebBrowser1.IsBrowserInitializedChanged += new EventHandler(delegate {
    devTool = chromiumWebBrowser1.GetBrowser().GetDevToolsClient();
});
//Common execution method  method: CDP method name ,param: method param
public async Task<string> ExecuteDevToolsMethods(string method, IDictionary<string, object> param = null)
{
    DevToolsMethodResponse resp = await devTool.ExecuteDevToolsMethodAsync(method, param);
    return resp.ResponseAsJsonString;
}
//call 
private void button3_Click(object sender, EventArgs e)
{
    ExecuteDevToolsMethods("DOM.getDocument").ContinueWith(new Action<Task<string>>((result) => {
        Console.WriteLine(result.Result);
    }));
}
if Please point out if I have misunderstood,very thank!