Winform App - 网页交互

Posted

技术标签:

【中文标题】Winform App - 网页交互【英文标题】:Winform App - Webpage Interaction 【发布时间】: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 【参考方案1】:

这个怎么样:

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

它适用于我的程序。

【讨论】:

谢谢,我会试一试并及时通知您。 我试过了,但问题还是一样。当我打开我的应用程序并加载页面时,它会填写用户详细信息但无法单击按钮。我手动单击它,我登录了。在我的应用程序的网站上,我单击注销,页面将我重定向回登录,大约 2 秒后我再次登录,因为它做了它应该做的事情。我真的很难弄清楚这两种情况之间的区别。感谢您的反馈 你可以检查按钮是否真的是“login_button” 刚刚通过调试器检查,它确实是正确的按钮,因为我可以例如更改其上的文本,它有效,它只是 onclick 事件不起作用。但是,当我在该工具中注销时它确实有效,然后它能够​​自动连接,因此它确实执行它,但不是在主启动时..正如 Ovais 建议的那样,我将尝试添加超时。 你写的逻辑应该确实有效,它也差不多,我认为这真的与网页有关。感谢您的反馈。【参考方案2】:

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

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

【讨论】:

感谢回复,我试试看。 它确实有效,我放入了一个 bgw,它睡了大约一秒钟,然后触发了我在表单上的 button_onlcick 事件,它运行良好。这确实是一种解决方法,我真的很想弄清楚它为什么会发生,但至少我现在可以先继续应用程序的其余部分。非常感谢。

以上是关于Winform App - 网页交互的主要内容,如果未能解决你的问题,请参考以下文章

C#在WinForm中使用WebKit传递js对象实现与网页交互的方法

C# winform 如何根据URL直接下载网页保存在本地?

webbrowser 控件实现WinForm与WebForm交互

winform 中如何引用js和css??

C# 怎么保存WinForm应用程序的配置?

WinForm(十三)WebView2