2008-09-18 100 views
7

我想弄清楚如何以编程方式点击网页上的按钮。如何以编程方式单击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" /> 
+0

[这里的一个很好的参考用于使用web浏览器控件(.NET 2.0)与不同形式的元件相互作用(http://www.webtropy.com/articles/InternetExplorer.asp?Internet%20explorer)。 – 2008-10-03 20:34:10

回答

8

这是如何工作的?对我的作品

HtmlDocument doc = webBrowser1.Document; 

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

你可以尝试直接通过clientscript调用Page_ClientValidate()方法,而不是点击该按钮,让我挖了一个例子。

使用MSHTML

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

这可能是一个问题,如果登录页面专门寻找按钮的点击 – 2008-09-18 19:50:26

+0

非常真实,我曾考虑过这一点,但决定我会抛出invoke方法。 – 2008-09-18 19:55:21

6

变种BTN =的document.getElementById(btnName); (btn)btn.click();

+0

如果是我需要的客户端脚本,那真是太棒了,但我想要做的是服务器端。 – Cyberherbalist 2008-09-18 19:49:03

1

你试过fireEvent而不是RaiseEvent?

1

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

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

0

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

0

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

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"); 

它会抛出一个异常,如果与价值“登陆”提交的输入,但是你可以打破它,如果你要有条件地在调用点击之前检查。

相关问题