не може да получи Elements елементи на уеб браузъра. „A“ и „INPUT“ и така в delphi 2007

момчета, английският ми е лош, но имам нужда от вашата помощ...

Не мога да получа рамки и елементи от един уеб браузър и трябва да получа всички. "делфи 2007".

без това приложение на моя компютър получавам всичко, но когато инсталирам това приложение, много входове не се присвояват. виж...

public
 doc1: IHTMLDocument2;
 Elementos: IHTMLElementCollection;
 Elemento: IHTMLElement;
end;

procedure TNavegador.wbDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL:  OleVariant);
var
 Z : Integer;
begin
 doc1 := (pDisp as IWebBrowser2).Document as IHTMLDocument2;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Memo3.Text := Wb.OleObject.Document.documentElement.innerText; //not assigned

 memo2.Text := doc1.body.innerHTML; // work. <-----

 Elementos := (doc1.all).tags('A') as IHTMLElementCollection; //not assigned

 if Assigned(Elementos) then
 begin
  for Z := 0 to Elementos1.length - 1 do
  begin
   Elemento := Elementos.Item(Z, 0) as IHTMLElement;
   if Assigned(Elemento) then
   begin
    if pos('/IMG/bt_voltar.gif', Elemento.innerHTML) > 0 then
    begin
     Elemento.Click; //click in link back
    end;
   end;
  end;
 end;

end;

  procedure TForm1.Button2Click(Sender: TObject);
  var
   Q : Integer;
   Elementos1: IHTMLElementCollection;
   Elemento1: IHTMLElement;
  begin
     Elementos1 := (doc1.all).tags('INPUT') as IHTMLElementCollection; //not assigned

     for Q := 0 to Elementos1.length - 1 do
     begin
      Elemento1 := Elementos1.Item(Q, 0) as IHTMLElement;
      if Assigned(Elemento1) then
      begin
       if Elemento1.getAttribute('name', 0) = 'Post_me' then
       begin
        Elemento1.setAttribute('value', '010203', 0);
       end;

       if Elemento1.getAttribute('name', 0) = 'btn_click' then
       begin
        Elemento1.Click;
       end;
      end;
     end;

   end;

function getAllInputs(doc: IHTMLDocument2): IHTMLElementCollection; //not assigned
var
 elementos: IHTMLElementCollection;
begin
 elementos := (doc.all).tags('input') as IHTMLElementCollection;
 result := elementos;
end;

function getAllLinks(doc: IHTMLDocument2): IHTMLElementCollection; //not assigned
var
 elementos: IHTMLElementCollection;
begin
 elementos := (doc.all).tags('A') as IHTMLElementCollection;
 result := elementos;
end;

Много идеи????? чакане

Благодаря.


person user1213118    schedule 16.02.2012    source източник
comment
Трябва да получа всички входове, рамки, връзки и т.н., имам представа кой прави това.   -  person user1213118    schedule 16.02.2012
comment
Проблемът е, че вашата реализация на wbDocumentComplete е неправилна, тя се задейства многократно.   -  person whosrdaddy    schedule 16.02.2012
comment
@whosrdaddy, извинявай, но откъде разбра, че wbDocumentComplete се задейства многократно?   -  person TLama    schedule 16.02.2012
comment
Уверявам ви, че ще получите това събитие за всеки фреймсет :)   -  person whosrdaddy    schedule 16.02.2012
comment
@whosrdaddy, благодаря, че ме подтикна да опитам :) Никога не съм забелязвал това (и никога не е имало нужда) Вашият отговор тогава е IMHO най-вероятно причината за проблема тук (+1)   -  person TLama    schedule 17.02.2012


Отговори (1)


Вашият проблем се крие във факта, че събитието OnDocumentComplete ще бъде задействано за ВСЕКИ фреймсет + горния документ. Ето примерен код как правилно да внедрите това събитие:

procedure TFrm_browser.BrowserDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);

var CurrentBrowser: IWebBrowser2;
    TopBrowser: IWebBrowser2;
    Doc :  IHTMLDocument2;

begin
  CurrentBrowser := pDisp as IWebBrowser2;
  TopBrowser := (ASender as TWebbrowser).DefaultInterface;
  if Assigned(CurrentBrowser) and Assigned(TopBrowser) then
   begin
    Doc := CurrentBrowser.Document as IHTMLDocument2;
    if CurrentBrowser = TopBrowser then
     begin
      if Assigned(FOnCompleteDocLoaded) then
       FOnCompleteDocLoaded(Self, Doc);
     end
    else
     begin
      if Assigned(FOnFrameSetLoaded) then
       FOnFrameSetLoaded(Self, Doc);
     end;
   end;
end;

Трябва да обработите всеки набор от рамки и горния документ.

РЕДАКТИРАНЕ

Тъй като OP няма представа, направих малък тестов проект:

unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, StdCtrls, Mshtml;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
  private
    { Private declarations }
    procedure GetH3Tags(Doc :  IHTMLDocument2);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 WebBrowser1.Navigate('http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_frame_cols');
end;

procedure TForm1.GetH3Tags(Doc: IHTMLDocument2);

var Elements: IHTMLElementCollection;
    Element : IHTMLElement;
    Index : Integer;

begin
 Elements := Doc.all.tags('h3') as IHTMLElementCollection;
 Index := Elements.length;
 while Index > 0 do
  begin
   Dec(Index);
   Element := Elements.item(Index, '') as IHTMLElement;
   Memo1.Lines.Add(Element.innerText);
  end;
end;

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
var CurrentBrowser: IWebBrowser2;
    TopBrowser: IWebBrowser2;
    Doc :  IHTMLDocument2;

begin
  CurrentBrowser := pDisp as IWebBrowser2;
  TopBrowser := (ASender as TWebbrowser).DefaultInterface;
  if Assigned(CurrentBrowser) and Assigned(TopBrowser) then
   begin
    Doc := CurrentBrowser.Document as IHTMLDocument2;
    if CurrentBrowser = TopBrowser then
     begin
      // get tags for top level document
       GetH3Tags(Doc);
     end
    else
     begin
      // get tags for each frameset
       GetH3Tags(Doc);
     end;
   end;
end;


end.

DFM файл:

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 427
  ClientWidth = 899
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object WebBrowser1: TWebBrowser
    Left = 209
    Top = 0
    Width = 690
    Height = 427
    Align = alClient
    TabOrder = 0
    OnDocumentComplete = WebBrowser1DocumentComplete
    ExplicitLeft = 56
    ExplicitTop = 24
    ExplicitWidth = 300
    ExplicitHeight = 150
    ControlData = {
      4C00000050470000222C00000000000000000000000000000000000000000000
      000000004C000000000000000000000001000000E0D057007335CF11AE690800
      2B2E126208000000000000004C0000000114020000000000C000000000000046
      8000000000000000000000000000000000000000000000000000000000000000
      00000000000000000100000000000000000000000000000000000000}
  end
  object Memo1: TMemo
    Left = 0
    Top = 0
    Width = 209
    Height = 427
    Align = alLeft
    Color = clHighlight
    TabOrder = 1
  end
end

Тази проба ще получи всички H3 тагове от тази страница: http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_frame_cols

@Tlama: това е добър пример, при който OnDocumentcomplete ще се задейства няколко пъти.

person whosrdaddy    schedule 16.02.2012
comment
бихте ли обяснили повече, какво представляват събитията FOnCompleteDocLoaded и FOnFrameSetLoaded и как да се справят с анализирането в тях за OP? Лично аз никога не съм преживявал OnDocumentComplete да бъде стрелян повече от веднъж за навигацията (може би съм имал късмет :) Благодаря - person TLama; 16.02.2012
comment
Това е просто копиране и поставяне на текущата ми реализация. това е моят източник: cryer.co.uk/brian/delphi /twebbrowser/. - person whosrdaddy; 16.02.2012
comment
@user1213118 това полезно ли е или не? - person whosrdaddy; 17.02.2012
comment
не... имам един проблем. FOnCompleteDocLoaded и FOnFrameSetLoaded, какво е това? след това whow ще използвам в моя проект. Elementos := (Doc.all).tags('A') като IHTMLElementCollection; да променя Doc1 за Doc? PS: Bryan Cryer ми помогна за миналото, много имейли, добри хора, благодаря, човече. - person user1213118; 18.02.2012
comment
+1. Само едно не спазвам. защо четеш елементите наобратно? защо просто не използвате for Index := 0 to Elements.length - 1? - person kobik; 23.02.2012
comment
о, това е просто навик, просто мразя for-циклите - person whosrdaddy; 23.02.2012
comment
Извинявай приятел. но не работи отново... вашият пример работи h3 на тази страница, но в моя случай не работи. Получавам innerHtml, innerText, outerHtml, outerText, с doc1 и doc. но елементи не. това се случва, защото имам инсталирано едно приложение на компютъра на моя шеф, един плъгин, неговите елементи за скриване, мисля. Не знам какво се случва, но без този плъгин работи 100%. Не мога да покажа кодовата страница тук, за да защитя сигурността на моя шеф. имаш ли друг начин? добави ме. garimpeiro2012 @ hotmail. com, без място разбира се. моля те, човече, работата ми зависи от това. - person user1213118; 25.02.2012
comment
наблюдение: Получавам кода на страницата в уеб браузъра с: Memo2.Text := Doc1.body.innerHTML; и виждам име на елементи, стойности, име на формуляри, рамки, всичко. Редактирам с Dreaweaver. и знам всички имена, но с този код: Element := Elements.item(Index, '') as IHTMLElement; if element <> nil then Memo2.Lines.Add(Element.getAttribute('name', Index)); не получавам нищо. разбираш ли ме съжалявам за лошия английски. :S благодаря за помощта. - person user1213118; 25.02.2012
comment
Изпробвахте ли дори моя код? Моля, актуализирайте публикацията си и покажете какво имате досега... - person whosrdaddy; 25.02.2012
comment
@whosrdaddy, пробвам твоя код, но на страницата на шефа ми не работи, използвам същия източник и пробвах твоя код, елементите, формите, рамките са призраци. Наистина не знам какво да правя. На път съм да се откажа. Тъжна съм, а шефът ми е ядосан. добавете моята поща, ще ви покажа страницата и ще влезете в системата... Шефът ми позволи. - person user1213118; 25.02.2012