Tengo que modificar un proyecto (C#) que usa CefSharp para automatizar una tarea web. Cada vez que el código necesita ejecutar una pieza de Javascript, utiliza:
browser.ExecuteScriptAsyncWhenPageLoaded(script);Pero ahora tengo casos en los que Javascript debe ejecutarse sincrónicamente, es decir:
ExecuteScript(script1); [wait for script1 to complete] [do some stuff] ExecuteScript(script2); [etc]Entonces, ¿hay alguna manera de hacer una llamada Javascript síncrona en CefSharp?
El navegador es fundamentalmente asíncrono, JavaScript se ejecuta en un proceso separado. Puede esperar las llamadas asincrónicas.
private async void Button_Click(object sender, EventArgs e) { string jsScript1 = "1 + 1"; JavascriptResponse response1 = await browser.EvaluateScriptAsync(jsScript1); var onePlusOne = (int)response1.Result; // Do some work here. // If your JavaScript results in a navigation then you can use WaitForNavigationAsync to wait for the page to load, see example below string jsScript2 = "some java script code"; JavascriptResponse response2 = await browser.EvaluateScriptAsync(jsScript2); }Algunos ejemplos de uso más comunes.
//An extension method that evaluates JavaScript against the main frame. JavascriptResponse response = await browser.EvaluateScriptAsync(script); //Evaluate javascript directly against a frame JavascriptResponse response = await frame.EvaluateScriptAsync(script); //An extension method that evaluates Javascript Promise against the main frame. //Uses Promise.resolve to return the script execution into a promise regardless of the return type //This method differs from EvaluateScriptAsync in that your script **must return** a value //Examples below JavascriptResponse response = await browser.EvaluateScriptAsPromiseAsync(script); //JavaScript that results in a navigation. var navigationTask = browser.WaitForNavigationAsync(); var evaluateTask = browser.EvaluateScriptAsync($"window.location.href = 'github.com';"); await Task.WhenAll(navigationTask, evaluateTask); var navigationResponse = navigationTask.Result;Para aquellos nuevos en CefSharp, también sugiero leer https://github.com/cefsharp/CefSharp/wiki/General-Usage#javascript-integration