问题描述
嗨,我是 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);