如何以编程方式单击ASP.NET网页上的按钮?
我想弄清楚如何以编程方式点击网页上的按钮。如何以编程方式单击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");
这填补了用户名和密码文本框罚款,但我没有任何成功获得该按钮点击;我也试过“点击”,“点击”和“点击” - 还有什么?搜索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" />
这是如何工作的?对我的作品
HtmlDocument doc = webBrowser1.Document;
doc.All["userIDTextBox"].SetAttribute("Value", "user1");
doc.All["userPasswordTextBox"].SetAttribute("Value", "Password!");
doc.All["logonButton"].InvokeMember("Click");
你可以尝试直接通过clientscript调用Page_ClientValidate()方法,而不是点击该按钮,让我挖了一个例子。
使用MSHTML
mshtml.IHTMLWindow2 myBroserWindow = (mshtml.IHTMLWindow2)MyWebBrowser.Document.Window.DomWindow;
myBroserWindow.execScript("Page_ClientValidate();", "javascript");
这可能是一个问题,如果登录页面专门寻找按钮的点击 – 2008-09-18 19:50:26
非常真实,我曾考虑过这一点,但决定我会抛出invoke方法。 – 2008-09-18 19:55:21
变种BTN =的document.getElementById(btnName); (btn)btn.click();
如果是我需要的客户端脚本,那真是太棒了,但我想要做的是服务器端。 – Cyberherbalist 2008-09-18 19:49:03
你试过fireEvent而不是RaiseEvent?
您可以直接调用该方法并传入通用对象和EventArgs参数。当然,如果您正在查看特定数据的sender和EventArgs参数,这可能不起作用。我通常如何处理这个问题是将方法的内容重构为doSomeAction()方法,而按钮单击的事件处理程序将简单地调用此函数。这样我就不必弄清楚如何调用通常只是一个事件处理程序来在页面/表单上执行一些逻辑。
在javascript单击表单按钮的情况下,您可以调用客户端脚本中的form.submit() - 它将运行您在标记中定义的任何验证脚本 - 然后解析Form_Load事件并获取该表单上提交按钮的文本值(假设只有一个) - 至少这是我熟悉的ASP.NET 1.1方式...任何人都知道2.0+ ?
您发布了一条评论,不愿意在@ Phunchak的答案中使用客户端脚本。我认为你想做的事情是不可能的。与表单交互的唯一方法是通过客户端脚本。 C#代码只能控制页面发送到浏览器之前发生的事情。
试试这个 button.focus System.Windows.Forms.SendKeys.Send( “{ENTER}”)
只是一个可能有用的额外地方按钮却没有得到提交一个Id--就像往常一样。
private HtmlElement GetInputElement(string name, HtmlDocument doc) {
HtmlElementCollection elems = doc.GetElementsByTagName("input");
foreach (HtmlElement elem in elems)
{
String nameStr = elem.GetAttribute("value");
if (!String.IsNullOrEmpty (nameStr) && nameStr.Equals (name))
{
return elem;
}
}
return null;
}
所以,你可以调用它像这样:
GetInputElement("Login", webBrowser1.Document).InvokeMember("Click");
它会抛出一个异常,如果与价值“登陆”提交的输入,但是你可以打破它,如果你要有条件地在调用点击之前检查。
[这里的一个很好的参考用于使用web浏览器控件(.NET 2.0)与不同形式的元件相互作用(http://www.webtropy.com/articles/InternetExplorer.asp?Internet%20explorer)。 – 2008-10-03 20:34:10