Доступ к изображениям, отображаемым TWebBrowser, но не содержащимся в его коллекции изображений - PullRequest
3 голосов
/ 02 апреля 2019

Веб-страница здесь неожиданно возникла еще один вопрос о получении изображений из электронной таблицы.

Если вы перейдете на страницу в FF, вы увидите, что есть два изображения,на LHS синих полос заголовка.

Однако, если я загружаю страницу в TWebBrowser и запускаю следующий код

procedure TForm1.GetImageCount;
var
  Count : Integer;
  Doc : IHtmlDocument2;
begin
  Doc := IDispatch(WebBrowser1.Document) as IHtmlDocument2;
  Count := Doc.images.length;
  ShowMessageFmt('ImageCount: %d', [Count]);
end;

, в окне сообщения отображается счетчик 1, а неожидаемый (во всяком случае, для меня) 2. Я могу легко получить доступ и сохранить на диск первое отображаемое изображение, но не второе или любое последующее, потому что их нет в коллекции IHtmlDocument2 Images загруженной страницы.

Итак, мой вопрос: как мне получить второе изображение, чтобы сохранить его на диск?

Отладчик FF показывает, что веб-страница заполнена javascript, и я думаю, чтодолжно появиться второе изображение, но я не знаю, как его получить.

Есть идеи?

1 Ответ

2 голосов
/ 03 апреля 2019

Второе изображение на сайте, на который вы ссылаетесь, находится в iframe. Вы можете получить доступ к iframe из события OnDocumentComplete:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw, MsHtml;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    procedure WebBrowser1DocumentComplete(ASender: TObject;
      const pDisp: IDispatch; const URL: OleVariant);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.FormShow(Sender: TObject);
begin
 WebBrowser1.Navigate('https://www.nbbclubsites.nl/club/8000/uitslagen');
end;

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: 

IDispatch; const URL: OleVariant);

var
  currentBrowser: IWebBrowser;
  topBrowser: IWebBrowser;
  Doc : IHtmlDocument2;

begin
  currentBrowser := pDisp as IWebBrowser;
  topBrowser := (ASender as TWebBrowser).DefaultInterface;
  if currentBrowser = topBrowser then
   begin
    // master document
    Doc := currentBrowser.Document as IhtmlDocument2;
    ShowMessageFmt('ImageCount: %d', [Doc.images.length]);
   end
  else
  begin
   // iframe
   Doc := currentBrowser.Document as IhtmlDocument2;
   ShowMessageFmt('ImageCount: %d', [Doc.images.length]);
  end;
end;

end.

Сохранение фактического изображения уже покрыто другим вопросом

...