javascript - 在 geckoWebBrowser 中模拟 HTML 文本框中的击键

标签 javascript jquery html keyevent gecko

我正在使用“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/

相关文章:

jquery:install 在 Rails 中不起作用

asp.net-mvc-3 - Css 表单不适合页面

java - 为什么struts2 html table会多生成一个<tr></tr>

javascript - Jquery数据属性改变并影响CSS

javascript - 酵素的浅薄是渲染 child 的 child 吗?

javascript - 如何遍历数组并删除 JavaScript 中的元素

javascript - 如何检查鼠标在元素上停留了一些秒

javascript - 来自 JavaScript 的模态窗口,未打开

javascript - 将数据存储在表中

javascript - 当值已经存在于使用javascript的数组中时如何显示警告消息