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

7
我正在尝试找出如何以编程方式单击网页上的按钮。
具体而言,我有一个带有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");

这段代码填充了用户ID和密码文本框,但我却无法成功点击该按钮。我已经尝试过“click”,“Click”和“onClick”,还是不行。对MSDN进行搜索当然没有任何线索,groups.google.com也是一样。我一定很接近答案了。或者不是吗?有人告诉我应该调用页面的POST方法,但这个如何实现并未提供。
顺便说一下,该按钮的代码为:
<input type="submit" name="logonButton" value="Login" onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="logonButton" tabindex="4" />

这是一个很好的参考链接,用于使用WebBrowser控件(.NET 2.0)与不同表单元素交互。 - Adam Neal
9个回答

8

这是如何运作的? 对我有效

HtmlDocument doc = webBrowser1.Document;

doc.All["userIDTextBox"].SetAttribute("Value", "user1");
doc.All["userPasswordTextBox"].SetAttribute("Value", "Password!");
doc.All["logonButton"].InvokeMember("Click");

7

var btn = document.getElementById(btnName); 如果btn存在,那么就触发点击事件


这很棒,如果我需要客户端脚本的话,但我现在想做的是服务器端。 - Cyberherbalist

2

1

如果提交按钮没有被赋予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");

如果提交输入值为“Login”,它将引发异常,但如果您想在调用单击之前有条件地检查,可以将其拆分。


1
我感到有点淘气,重新调整以接受控制文档,使其成为通用函数。 - MonsCamus

1
你可以尝试通过客户端脚本直接调用Page_ClientValidate()方法,而不是点击按钮,让我找一个例子。
使用MSHTML。
mshtml.IHTMLWindow2 myBroserWindow = (mshtml.IHTMLWindow2)MyWebBrowser.Document.Window.DomWindow;
myBroserWindow.execScript("Page_ClientValidate();", "javascript");

如果登录页面特别寻找按钮的点击,那么这可能会成为一个问题。 - Jeff Martin
非常正确,我曾经考虑过这个问题,但最终还是决定放弃调用该方法。 - Quintin Robinson

1
你尝试过使用fireEvent而不是RaiseEvent吗?

1

您可以直接调用该方法并传递通用对象和EventArgs参数。当然,如果您正在查看特定数据的发送方和EventArgs参数,则可能无法正常工作。我通常处理的方式是将方法的实质部分重构为doSomeAction()方法,按钮单击的事件处理程序将简单地调用此函数。这样,我就不必想办法调用通常只是事件处理程序来执行页面/表单上的某些逻辑。

在JavaScript点击提交表单的情况下,您可以在客户端脚本中调用form.submit() -- 这将运行您在中定义的任何验证脚本 -- 然后解析Form_Load事件并获取该表单上提交按钮的文本值(假设只有一个)-- 至少这是我非常熟悉的ASP.NET 1.1的方式... 有人知道2.0+中更优雅的方法吗?


0

尝试这个 button.focus System.Windows.Forms.SendKeys.Send("{ENTER}")


0

你在@Phunchak的回答中发表了一个不想使用客户端脚本的评论。我认为你想做的是不可能的。与表单交互的唯一方法是通过客户端脚本进行操作。C#代码只能控制在页面发送到浏览器之前发生的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接