【问题标题】:Get HTML from existing instance of Internet Explorer from Delphi从 Delphi 的 Internet Explorer 的现有实例中获取 HTML
【发布时间】:2013-10-12 12:17:26
【问题描述】:

在一个特定的网站上,如果我打开一个新的 IE 实例,我已经通过了身份验证,只要同时有另一个我之前登录过的 IE 实例。 如果我从 Delphi 打开一个 tWebbrowser,我没有通过身份验证。 由于我不想登录我创建的每一个 tWebbrowser,我想找到一种方法来保持这种身份验证正常工作,当我手动打开 IE 的新实例时。 目的是从我登录的不同页面获取 HTML。

我想要一个

1) 从使用 ShellExecute 打开的 Internet Explorer 实例中获取 HTML

2) 让 tWebbrowser 记住所有其他打开的 IE 实例的身份验证

3) 将 tWebbrowser 连接到 Internet Explorer 的现有实例

4) 从 Delphi 获取 HTML 的其他方法

身份验证我不知道如何自动化,因为它是 java/sso。

【问题讨论】:

  • 如果用户可以在他们的浏览器中进行身份验证,为什么他们不能在您的浏览器中进行呢?
  • 是的,可以在我的tWebbrowser中进行身份验证,但是由于我想用很多tWebbrowser做一个自动化程序,所以很难登录这么多次。
  • 您需要网络浏览器吗?你需要渲染html吗?为什么不从用户那里获取凭据,存储它们,然后使用 Indy 之类的东西来获取 HTML?
  • 登录过程使用用户名和密码,然后java小程序显示一个数字,您必须在一张纸上的表格中查找,然后输入到小程序中。在我的 windows xp 机器上大约需要 1 分钟。

标签: html delphi internet-explorer mshtml twebbrowser


【解决方案1】:

您可以通过执行以下操作在 Windows shell 中查询 IE 窗口:

uses ShDocVw_Tlb; // or ShDocVw

if Doc = Nil then
  exit;
if Doc.body = Nil then
  exit;

var
  i: Integer;
  Browser: IWebBrowser2;
  ShellWindows: IShellWindows;
  Doc : IHtmlDocument2;

ShellWindows := CoShellWindows.Create;
for i := 0 to ShellWindows.Count - 1 do
  if Supports(ShellWindows.Item(i), IWebBrowser2, Browser) then 
  begin
    // do something with Browser instance, e.g compare the Url you're
    // expecting with Browser.LocationUrl
    // if it is, then you can get at the Html by something like

    Browser.Document.QueryInterface(IHtmlDocument2, Doc);
    if (Doc <> Nil) and (Doc.Body <> Nil) then  
    // access any of the Doc's properties, e.g. InnerHtml

  end;

显然,当 Support 返回 true 时,您可以检查返回的浏览器以查找您要查找的内容。例如。您可以使用浏览器 Document 的 IHtmlDocument2 接口(首先检查它是否不是 Nil)来访问它的 DOM、HTML 等。我想找到一个 TWebBrowser 窗口相对简单,如果那是你想要的去做。

【讨论】:

  • Delphi 中没有 ShDocVw_Tlb。除非您明确导入 ShDocVw。并且您的代码显示我有 2 个 IWebBrowser2 即使我从未打开过 IE。
  • "你的代码显示我有 2 个 IWebBrowser2" 嗯,这并不一定意味着它们来自 IE,是吗?
  • 我意识到(不确定它们是否来自思想)。同样,您应该在回答中提及这一点。只是想改善你的答案:)
  • "您的代码显示我有 2 个 IWebBrowser2" 好吧,a) 他可以检查返回的浏览器的 url 以查看它是否是他正在寻找的那个,并且 b) 在实践中我发现这种方法更可靠而不是在有多个 IE 运行实例(根据 TaskMan)时尝试查询 IE。
  • ->MartynA 据我所知,您的代码运行良好。当我使用 Browser.Navigate(...) 时,它会打开一个新的 IE 实例。没关系,因为身份验证仍然有效。但是如何检查页面是否已完全加载?通常我使用Ondocumentcomplete,但是当我没有tWebbrowser时,我不知道该怎么做。我曾尝试使用 Browser.Busy=false 但我不知道它是否总是有效。如何检查现有实例之一的 url?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多