尝试使用JavaScript在CefSharp3(OffScreen)中模拟用户输入

时间:2017-08-09 09:54:28

标签: javascript c# web chromium-embedded cefsharp

我正在尝试使用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 ,同样的问题。

1 个答案:

答案 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);