cefsharp 发送 Tab 键 - 不良行为

问题描述

嗨,我是 cefsharp 的新手,我非常喜欢使用它。我遇到的一件事是,当我使用代码发送 TAB 键希望遍历网页时,它的行为不像人工制表。

我使用的基本代码是这里的 winforms 代码: https://github.com/cefsharp/CefSharp.MinimalExample

例如,当我在使用谷歌搜索页面初始化浏览器后添加此代码时:

        for (int i = 0; i < 1000; i++)
        {
            CefSharp.KeyEvent keyEvent = new KeyEvent();

            keyEvent.WindowsKeyCode = (int)Keys.Tab;
            keyEvent.FocusOnEditableField = true;
            keyEvent.IsSystemKey = false;
            keyEvent.Type = KeyEventType.Char;
            browser.GetBrowser().GetHost().SendKeyEvent(keyEvent);
            await Task.Delay(50);
        }

我所期待的就像在屏幕上手动切换,每次都聚焦其中一个页面元素,按照它们在页面上的位置顺序。

然而,我发现网页上似乎没有出现标签,直到当我在搜索框内部单击时,它才会在框中添加标签。通过手动选项卡,焦点将离开搜索框。当我将焦点设置到另一个页面元素(例如上图)时,它似乎不会因为程序保持 Tab 键而失去焦点。

任何说明将不胜感激。 谢谢。

解决方法

好的,这是我自己的解决方案的工作代码。有两种方法,一种是针对字符串,一种是针对特殊键。我没有做过大量的测试,所以它可能不适合所有情况:

public static async Task SendStringToBrowser(this IWebBrowser browser,string sData)
{            

    var charArray = sData.ToCharArray();

    foreach (char c in charArray)
    {
        CefSharp.KeyEvent keyEvent = new KeyEvent();

        keyEvent.WindowsKeyCode = (int)c;
        keyEvent.FocusOnEditableField = true;
        keyEvent.IsSystemKey = false;
        keyEvent.Type = KeyEventType.Char;
        browser.GetBrowser().GetHost().SendKeyEvent(keyEvent);

        await Task.Delay(200);
    }
}

public static async Task SendKeyToBrowser(this IWebBrowser browser,System.Windows.Forms.Keys key)
{
    
    CefSharp.KeyEvent keyEvent = new KeyEvent();

    keyEvent.WindowsKeyCode = (int)key;
    keyEvent.FocusOnEditableField = true;
    keyEvent.IsSystemKey = false;
    keyEvent.Type = KeyEventType.KeyDown;
    browser.GetBrowser().GetHost().SendKeyEvent(keyEvent);

    await Task.Delay(50);

    keyEvent.WindowsKeyCode = (int)key;
    keyEvent.FocusOnEditableField = true;
    keyEvent.IsSystemKey = false;
    keyEvent.Type = KeyEventType.KeyUp;
    browser.GetBrowser().GetHost().SendKeyEvent(keyEvent);
    await Task.Delay(50);

}

要将字符串发送到浏览器,请执行以下操作:

await browser.SendStringToBrowser(sDataToSend);

要向浏览器发送特殊密钥,请执行以下操作:

await browser.SendKeyToBrowser(Keys.Tab);

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...