6

Windows 窗体应用程序 - 在中操作输入元素WinForm WebBrowser

虽然我熟悉HttpWebResponse/HttpWebRequest登录到一个网站,但我现在通过使用 mshtml 库尝试它并发现了一些奇怪的行为,我想看看其他人是否可以在这里帮助我..

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

逻辑非常基本,我构建了一个带有内置 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 字段和 Password 字段
    • 该工具无法单击按钮
  • 我手动单击按钮,我已登录,我单击注销,我回到登录页面

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

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

非常感谢您对此事的任何反馈。

谢谢,凯文

编辑:

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

我在事件中触发了单击此按钮,webBrowser_Completed但它不起作用。出于某种原因,我添加到webBrowser_DocumentCompleted事件中的所有内容都不允许我触发WebBrowser控件中按钮的单击事件。一旦整个事件完成,如果我尝试触发它,它会起作用,但我想自动化这个..有什么建议吗?

4

2 回答 2

3

这个怎么样 :

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

它适用于我的程序。

于 2012-05-11T09:49:59.620 回答
3

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

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

于 2012-05-21T13:43:04.077 回答