我必须修改一个使用CefSharp实现web任务自动化的项目(CefSharp)。每次代码需要执行一段Javascript时,它都会使用:
browser.ExecuteScriptAsyncWhenPageLoaded(script);但现在我遇到了Javascript必须同步执行的情况,即:
ExecuteScript(script1);
[wait for script1 to complete]
[do some stuff]
ExecuteScript(script2);
[etc]那么,是否有办法在CefSharp中进行同步Javascript调用?
发布于 2022-05-08 23:19:52
浏览器基本上是异步的,JavaScript在一个单独的进程中运行。您可以等待异步调用。
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);
}一些更常见的用法示例。
//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;对于那些刚加入CefSharp的人,我也建议阅读https://github.com/cefsharp/CefSharp/wiki/General-Usage#javascript-integration
https://stackoverflow.com/questions/72151875
复制相似问题