我想弄清楚如何以编程方式点击网页上的按钮。
具体来说,我有一个带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" />
答案 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}”)