如何以编程方式单击ASP.NET网页上的按钮?
我试图弄清楚如何以编程方式单击网页上的按钮。
具体来说,我有一个带有WebBrowser控件的WinForm。导航到我要使用的目标ASP.NET登录页面后,在DocumentCompleted事件处理程序中,我将使用以下代码:
HtmlDocument doc = webBrowser1.Document; HtmlElement userID = doc.GetElementById("userIDTextBox"); userID.InnerText = "user1"; HtmlElement password = doc.GetElementById("userPasswordTextBox"); password.InnerText = "password"; HtmlElement button = doc.GetElementById("logonButton"); button.RaiseEvent("onclick");
这样可以很好地填充用户名和密码文本框,但是我无法成功地单击该按钮。我也尝试过"点击","点击"和" onClick"-还有什么?搜索msdn当然不会给我任何线索,也不给我groups.google.com。我要靠近。也许不是-有人告诉我我应该调用页面的POST方法,但是如何做到这一点并不属于建议的范围。
BTW该按钮编码:
<input type="submit" name="logonButton" value="Login" onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="logonButton" tabindex="4" />
解决方案
我们可以尝试直接通过clientscript调用Page_ClientValidate()方法,而不用单击按钮,让我举一个例子。
使用MSHTML
mshtml.IHTMLWindow2 myBroserWindow = (mshtml.IHTMLWindow2)MyWebBrowser.Document.Window.DomWindow; myBroserWindow.execScript("Page_ClientValidate();", "javascript");
var btn = document.getElementById(btnName);
如果(btn)btn.click();
这里有一个有关如何使用InvokeMember提交表单的示例。
http://msdn.microsoft.com/en-us/library/ms171716.aspx
我们是否尝试过用fireEvent而不是RaiseEvent?
我们可以直接调用该方法,并传入通用对象和EventArgs参数。当然,如果我们正在查看特定数据的sender和EventArgs参数,这可能不起作用。我通常的处理方式是将方法的内容重构为doSomeAction()方法,单击按钮的事件处理程序将简单地调用此函数。这样,我不必弄清楚如何调用通常只是事件处理程序的东西来在页面/表单上执行一些逻辑。
如果使用javascript单击表单发布的按钮,则可以在客户端脚本中调用form.submit(),该脚本将运行我们在标记中定义的任何验证脚本-然后解析Form_Load事件并获取文本值表单上的"提交"按钮(假设只有一个)-至少这是我非常熟悉的ASP.NET 1.1方式...有人知道2.0+会更优雅吗?
我们按照不想在@Phunchak的答案上使用客户端脚本的方式发布了评论。我认为我们要尝试做的事是不可能的。与表单交互的唯一方法是通过客户端脚本。 Ccode仅能控制将页面发送到浏览器之前发生的情况。
这是如何运作的?为我工作
HtmlDocument doc = webBrowser1.Document; doc.All["userIDTextBox"].SetAttribute("Value", "user1"); doc.All["userPasswordTextBox"].SetAttribute("Value", "Password!"); doc.All["logonButton"].InvokeMember("Click");
试试这个
按钮焦点
System.Windows.Forms.SendKeys.Send(" {ENTER}")