【发布时间】:2012-05-19 21:24:05
【问题描述】:
Windows 窗体应用程序 - 在 WinForm WebBrowser 中操作输入元素
虽然我熟悉HttpWebResponse/HttpWebRequest 来登录网站,但我现在正在尝试通过使用 mshtml 库并发现一些奇怪的行为,我想看看其他人是否可以提供帮助我在这里..
我有一个带有 Username 字段、Password 字段和 Button 的 java 后端的 HTML 登录页面。
逻辑非常基本,我已经构建了一个带有内置网络浏览器的 winform 应用程序。
在Document_Completed 事件中,我使用以下代码输入我的设置并单击按钮。
private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webBrowser.Url.ToString() == @"MyWebPage/signin")
{
HTMLDocument hdc = new HTMLDocumentClass();
hdc = (HTMLDocument)webBrowser.Document.DomDocument;
IHTMLElement elb = hdc.getElementById("login_button");
IHTMLInputElement elu = (IHTMLInputElement)hdc.getElementById("username");
IHTMLInputElement elp = (IHTMLInputElement)hdc.getElementById("password");
try
{
elu.value = "MyID";
elp.value = "MyPwd";
elb.click();
}
catch { }
}
}
除了此代码非常快速且没有错误处理之外,它应该可以解决问题,而且部分可行。
有两种情况:
-
我启动该工具,它会加载网页。
- 该工具会正确填充 UserID 字段和 Password 字段
- 工具点击按钮失败
-
我手动点击按钮,我登录,我点击注销,我回到登录页面
- 我立即重新登录,工具输入信息
- 该工具也会立即单击按钮。
有没有人可以解释我为什么会发生这种情况以及我如何使用当前设置解决这个问题(因此不使用HttpWebRequest)。我看不出在启动时加载页面或在注销后被重定向之间的区别,但显然那里有区别,或者我做错了什么。
非常感谢您对此问题的任何反馈。
谢谢, 凯文
编辑:
我在我的 Windows 窗体中添加了一个Button,它基于与下面相同的后端代码,以便单击网页上的按钮,这非常有效。
我在webBrowser_Completed 事件中触发了单击此按钮,但它不起作用。
出于某种原因,我添加到webBrowser_DocumentCompleted 事件的所有内容都不允许我触发WebBrowser 控件中按钮的单击事件。整个事件完成后,如果我尝试触发它,它会起作用,但我想自动执行此操作。有什么建议吗?
【问题讨论】:
-
似乎你不应该在第一个场景中完成点击文档。但是让我问一下,你为什么需要它?也许我可以建议其他方式
-
Regfor,这是针对我们在工作中构建的应用程序,逻辑使用大量 HTML 交互,我试图保持在同一行。但我总是乐于接受建议。谢谢
-
好的,我认为它是某种用于 Web 的测试或测试工具。认为使用 WebBrowser 与 DOM 交互有很多未记录的陷阱。所以,当我需要像你在 Web 测试或 Web 自动化上下文中做的事情时,我使用的是 Watin watin.org
-
你有没有尝试在文档完成功能中给予延迟,给它大约2秒的延迟......然后尝试触发点击事件!
-
@KevinLaerte Watin 已经开源了源代码,你可以看看他们是如何解决同样问题的watin.svn.sourceforge.net/viewvc/watin