我正在使用“geckoWebBrowser1”组件。我已导航到一个 URL,该 URL 将显示一个带有 ID 的登录文本框:login-email
现在我成功地将“someemail@hotmail.com”放入该文本框中。 但是,有必要实际键入文本框检测到 keydown/keyup 等事件的电子邮件。因此,当我尝试单击登录按钮时,即使“someemail@hotmail.com”存在,它仍然相信文本框中不存在任何文本。
所以我想知道当我在那里写电子邮件时如何安全地模拟关键事件。它必须是安全的,因此如果窗口未激活,则不应使用“SendKeys.Send”。我正在寻找一种安全的方法来做到这一点。例如,是否可以为此注入(inject) javascript?
文本框的 HTML 如下所示:
<input type="email" autocomplete="username" name="email" id="login-email" autofocus="autofocus" placeholder="Enter e-mail" class="el-input__inner">
//我使用的代码
private void geckoWebBrowser1_DocumentCompleted(object sender, Gecko.Events.GeckoDocumentCompletedEventArgs e)
{
//Input email address into this textBox when the "geckoWebBrowser1_DocumentCompleted" fires!
//<input type="email" autocomplete="username" name="email" id="login-email"
//autofocus="autofocus" placeholder="Enter e-mail" class="el-input__inner">
foreach (var elements in geckoWebBrowser1.Document.GetElementsByTagName("input"))
{
if (elements.Id.ToLower() == "login-email")
{
elements.SetAttribute("value", "someemail@hotmail.com");
break;
}
}
}
最佳答案
我找到了问题的解决方案。下面的解决方案模拟按键事件并将每个字母一一放入文本框中。
谢谢!
private void geckoWebBrowser1_DocumentCompleted(object sender, Gecko.Events.GeckoDocumentCompletedEventArgs e)
{
//Input email address
//<input type="email" autocomplete="username" name="email" id="login-email"
//autofocus="autofocus" placeholder="Enter e-mail" class="el-input__inner">
foreach (var elements in geckoWebBrowser1.Document.GetElementsByTagName("input"))
{
if (elements.Id.ToLower() == "login-email")
{
String username = "someemail@hotmail.com";
DomEventArgs ev = geckoWebBrowser1.Document.CreateEvent("KeyEvents");
var webEvent = new Gecko.WebIDL.Event(geckoWebBrowser1.Window.DomWindow, ev.DomEvent as nsISupports);
webEvent.InitEvent("focus", true, false);
elements.GetEventTarget().DispatchEvent(ev);
var nsIEventVar = ((nsIDOMKeyEvent)ev.DomEvent);
char[] inputChars = username.ToCharArray();
foreach (var vchar in inputChars)
{
int keyCode = (int)(System.Windows.Forms.Keys)vchar;
nsIEventVar.InitKeyEvent(new nsAString("keypress"), true, false, geckoWebBrowser1.Window.DomWindow, false, false, false, false, (uint)keyCode, (uint)keyCode);
Xpcom.QueryInterface<nsIDOMEventTarget>(elements.DomObject).DispatchEvent(nsIEventVar);
}
}
}
}
关于javascript - 在 geckoWebBrowser 中模拟 HTML 文本框中的击键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57906944/