【问题标题】:Controlling Internet Explorer in order to enter username/password控制 Internet Explorer 以输入用户名/密码
【发布时间】:2012-05-16 19:48:41
【问题描述】:

我正在考虑尝试让我的 C++ 应用程序执行以下操作:

  1. 打开 Internet Explorer
  2. 打开网页
  3. 在网页的特定表单中输入名称和密码
  4. 点击网页上的提交按钮打开一个新页面

从我在 Internet 上的搜索来看,使用 COM 似乎可以实现这一点,尽管我对此可能不正确。我目前正在尽我所能学习 COM,但一些帮助会很棒。我希望在不使用 MFC 的情况下执行此操作。

我注意到this 问题,这是我正在寻找的问题,但我无法理解建议的解决方案。例如,我的工具箱中没有IWebBrowser2 选项。

编辑:

为了让我的问题更清楚,我通过简单地运行编码的 UI 测试在 C# 版本中完成了这项任务,但这不适用于 C++。我正在寻找打开 IE(不是在应用程序本身中),找到用户名和密码表单,将它们传递给字符串,然后在页面上找到提交按钮并单击它。

【问题讨论】:

  • 我已经删除了我的答案 - 表格填写是一个更难的问题,因为您必须首先找到正确的框来填写!我没有答案,但您可能需要编辑问题以更清楚地表明您正在查看表单提交,而不仅仅是 HTTP 基本身份验证。
  • 谢谢,我已经尽力让我的问题更清楚了。
  • 是现有网页吗?更简单的解决方案可能是打开 another 网页并在 URL 中编码用户名和身份验证字符串*。 (* 不是密码本身,这不安全,但基本上是密码的单向加盐哈希,以证明您知道它)。
  • 不幸的是它已经是一个现有的网页。这个功能似乎不是那么容易实现。

标签: c++ internet-explorer winapi com


【解决方案1】:

这在 c++ 中是非常可能的。您将不得不深入了解 winapi 来执行一些按键操作以及窗口处理。

我不会详细介绍所有代码,但您必须执行以下操作:

  • 启动ie(如果你给它一个带有网页的命令行参数,它会 打开该页面)。
  • 确保 ie 窗口处于焦点状态(要么等待 如果你想保持简单或使用窗口的 api 来遍历每个 打开HANDLE,找到你想要的窗口)
  • 使用SendInput 发送Alt + D(以获得对URL 栏的关注,在Firefox 中它将是CTRL + L
  • 根据需要使用SendInputjavascript injection 修改DOM
  • 你也可以submit the form(一切如你所愿)使用上面的JS注入能力。

【讨论】:

  • 感谢@g19fanatic。这是一个有趣的方法,我会看看。
【解决方案2】:

是的,这是可能的,但是您必须在应用程序中嵌入 Web 浏览器控件,而且这并不简单(我认为您不能通过 COM 在 Internet Explorer 的外部实例中自动执行 DHTML)。

我看到您不想使用 MFC,这使问题更加复杂。也许您可以通过 ATL 来完成,我建议您不要尝试在没有框架的情况下进行。

如果您可以使用 MFC,那么您可以使用 CDHtmlDialog 表单并访问底层 COM 接口以自动执行操作。

过去,我开发了一个使用 HTML 作为其用户界面的 MFC 应用程序,但我使用了您可以在此处找到的 CDHTMLView 类:http://www.codeproject.com/Articles/1783/Integrating-DHTML-into-MFC-Views

您可以将其用作学习如何处理 DHTML 事件以及如何使用IWebBrowser2 界面的入口点。

【讨论】:

  • 如果可能的话,我可能会看看用 ATL 做这件事。你知道有什么像样的网站来学习一些 ATL 吗?
  • 您实际上可以通过带有 MSAA 的 IE hwnd 访问 DOM; support.microsoft.com/kb/249232
  • @AlexK.: 哇,太酷了,而且 MSAA 从 XP 开始就可以集成在操作系统中了。我会更新答案。
【解决方案3】:

您真的应该看看 WebDriver,它能够完全按照您的描述进行操作。有关 InternetExplorerDriver 内部的更多信息,请参阅 (http://code.google.com/p/selenium/wiki/InternetExplorerDriverInternals)。即使您不能直接使用该项目,您当然也可以浏览源代码以更好地了解您想要做什么。

【讨论】:

  • 感谢@Mike 的链接。我试图在没有框架的情况下做到这一点,但我会首先尝试 g19fanatics 方法,看看我是否能得到想要的结果。
【解决方案4】:

你想做的事情没有多大意义。

有许多 API 可用于将浏览器视图嵌入到您的程序中。例如 Qt 提供了这个。

然后您可以自己执行 HTTP POST 请求并在浏览器视图中显示您得到的答案。

这是一个更清洁的解决方案。

专业提示:不要使用 Internet Explorer。

【讨论】:

  • 我不想先在应用程序中打开浏览器。我已经编辑了我的原始问题以使其更清楚。正如 awoodland 指出的那样,我希望在网页上执行表单归档。
猜你喜欢
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 2018-01-16
  • 2016-01-30
相关资源
最近更新 更多