cefsharp 发送 tab 键 - 不良行为

cefsharp send tab key - undesired behavior

您好,我是 cefsharp 的新手,我非常喜欢使用它。我 运行 感兴趣的一件事是,当我使用代码发送 TAB 键希望遍历网页时,它的行为不像人类的 Tab 键。

我使用的基本代码是来自此处的 winforms 代码: https://github.com/cefsharp/CefSharp.MinimalExample

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

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