我正在尝试使用JavaScript模拟CefSharp(OffScreen)上的用户操作。
加载页面后https://www.w3.org),
我想在搜索栏中搜索,
单击搜索按钮
打开第一个结果
所以我用过,
await browser.EvaluateScriptAsync("document.getElementsByName('q')[0].value = 'CSS';");
await browser.EvaluateScriptAsync("document.getElementById('search-submit').click();");
await browser.EvaluateScriptAsync("document.getElementById('r1-0').click();");
但我面临的问题是,截屏时,我必须在两端之间使用 Thread.Sleep(x),然后在执行下一步操作之前加载页面截图。
无论如何都要避免 SLEEP 并检测加载何时完成,进行下一步操作?
我也尝试了 ExecuteScriptAsync ,同样的问题。
答案 0 :(得分:1)
为此,您可以修改并使用 OffScreenExample 中的 LoadPageAsync()功能。
只需在您不使用 url 时替换更改参数,然后使用 url 删除if语句。
然后使用相应的浏览器对象在 EvaluateScriptAsync 之后调用 LoadPageAsync 。
修改后,函数将如下所示。
public static Task LoadPageAsync(IWebBrowser browser)
{
var tcs = new TaskCompletionSource<bool>();
EventHandler<LoadingStateChangedEventArgs> handler = null;
handler = (sender, args) =>
{
if (!args.IsLoading)
{
browser.LoadingStateChanged -= handler;
tcs.TrySetResultAsync(true);
}
};
browser.LoadingStateChanged += handler;
return tcs.Task;
}
用法就像,
await browser.EvaluateScriptAsync("document.getElementsByName('q')[0].value = 'CSS';");
await browser.EvaluateScriptAsync("document.getElementById('search-submit').click();");
await LoadPageAsyncCompleted(browser);
await browser.EvaluateScriptAsync("document.getElementById('r1-0').click();");
await LoadPageAsyncCompleted(browser);