【问题标题】:How to click a button on an ASP.NET web page programmatically?如何以编程方式单击 ASP.NET 网页上的按钮?
【发布时间】:2008-09-18 19:42:14
【问题描述】:

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

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

这很好地填充了用户名和密码文本框,但我没有成功让那个该死的按钮点击;我也试过“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" />

【问题讨论】:

标签: asp.net


【解决方案1】:

这是如何工作的?为我工作

HtmlDocument doc = webBrowser1.Document;

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果它是我需要的客户端脚本,那就太好了,但我想做的是服务器端。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您可以尝试直接通过客户端脚本调用Page_ClientValidate()方法,而不是点击按钮,让我挖掘一个例子。

      使用 MSHTML

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

      【讨论】:

      • 如果登录页面专门寻找按钮的点击,这可能是个问题
      • 非常正确,我曾考虑过这一点,但我还是决定放弃调用方法。
      【解决方案5】:

      你试过用 fireEvent 代替 RaiseEvent 吗?

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          在提交按钮未指定 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");
          

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

          【讨论】:

          • 我觉得有点调皮,于是重新接受了控制文档,让它成为一个通用函数。
          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            试试这个 按钮.焦点 System.Windows.Forms.SendKeys.Send("{ENTER}")

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-09-30
              • 2012-05-11
              • 1970-01-01
              • 2014-05-21
              • 1970-01-01
              • 1970-01-01
              • 2013-10-09
              • 1970-01-01
              相关资源
              最近更新 更多