如何以编程方式单击ASP.NET网页上的按钮?

时间:2020-03-06 14:23:09  来源:igfitidea点击:

我试图弄清楚如何以编程方式单击网页上的按钮。

具体来说,我有一个带有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}")