Winform App - 网页互动

时间:2012-05-11 09:16:52

标签: c# html winforms mshtml

Windows窗体应用程序 - 在WinForm WebBrowser

中操作输入元素

虽然我熟悉HttpWebResponse / HttpWebRequest登录网站,但我现在正在尝试使用mshtml库并发现一些奇怪的行为,我想看看是否有其他人可能能够帮助我...

我有一个HTML登录页面,其中包含一个带有Username字段,Password字段和Button的java后端。

逻辑是非常基本的,我有一个内置的webbrowser构建了一个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字段和密码字段
    • 该工具无法点击按钮
  • 我手动点击按钮,我已登录,点击退出,我回到登录页面

    • 我立即再次登录,该工具输入信息
    • 该工具也立即点击了该按钮。

是否有人能够解释我为什么会发生这种情况以及如何利用当前设置解决这个问题(因此不使用HttpWebRequest)。我没有看到在启动时加载页面或在注销后重定向之间的区别,但显然存在差异或者我做错了。

非常感谢任何有关此事的反馈。

谢谢, 凯文

编辑:

我在我的Windows窗体中添加了一个Button,它基于下面的相同后端代码,以便点击网页上的按钮,这非常有效。

我在webBrowser_Completed事件中触发了单击此按钮,但它无效。 出于某种原因,我添加到webBrowser_DocumentCompleted事件的所有内容都不允许我触发WebBrowser控件中按钮的click事件。一旦整个事件完成,如果我然后试图触发它它有效,但我想自动化这个..任何建议?

2 个答案:

答案 0 :(得分:3)

怎么样:

HtmlElement button = webBrowser.HtmlDocument.GetElementById("login_button");
button.InvokeMember("click");

它适用于我的程序。

答案 1 :(得分:3)

这可能是一个很长的镜头,而不是最优雅的解决方法,但如何让后台工作者在 DocumentCompleted 事件中运行一秒,然后触发您从其单独的线程中单击的按钮。这可能只是自动化。 由于这将从不同的线程运行,请记住,您可能必须调用某些控件,因此这可能是此解决方法的另一个缺点。

如果这不起作用,正如Regfor之前建议的那样,Watin.org可以帮助你。