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

时间:2008-09-18 19:42:15

标签: 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" />

9 个答案:

答案 0 :(得分:8)

这是如何工作的?适合我

HtmlDocument doc = webBrowser1.Document;

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

答案 1 :(得分:6)

var btn = document.getElementById(btnName); if(btn)btn.click();

答案 2 :(得分:2)

这里有一个使用InvokeMember提交表单的示例。 http://msdn.microsoft.com/en-us/library/ms171716.aspx

答案 3 :(得分:1)

您可以尝试直接通过clientscript调用Page_ClientValidate()方法,而不是单击按钮,让我挖掘一个示例。

使用MSHTML

mshtml.IHTMLWindow2 myBroserWindow = (mshtml.IHTMLWindow2)MyWebBrowser.Document.Window.DomWindow;
myBroserWindow.execScript("Page_ClientValidate();", "javascript");

答案 4 :(得分:1)

您是否尝试过fireEvent而不是RaiseEvent?

答案 5 :(得分:1)

您可以直接调用该方法并传入泛型对象和EventArgs参数。当然,如果您查看特定数据的sender和EventArgs参数,这可能不起作用。我通常如何处理这个问题是将方法的内容重构为doSomeAction()方法,按钮单击的事件处理程序将简单地调用此函数。这样我就不必弄清楚如何调用通常只是一个事件处理程序来在页面/表单上做一些逻辑。

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

答案 6 :(得分: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");

如果提交输入值为“登录”,则会引发异常,但如果要在调用点击之前有条件地检查,则可以将其分解。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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