2012-10-12 28 views
5

Cerco di ottenere il nome di tutti i moduli della pagina caricata. Ho fatto questo:Chromium: Come ottenere tutta la forma di una pagina caricata

procedure TForm2.Button2Click(Sender: TObject); 
var 
    L: TStringList; 
begin 
    L := TStringList.Create; 

    try 
    Chromium1.Browser.MainFrame.VisitDomProc(
     procedure (const doc: ICefDomDocument) 
     procedure IterateNodes(Node: ICefDomNode); 
     begin 
      if not Assigned(Node) then Exit; 
      repeat 
      if Node.ElementTagName = 'FORM' then 
       L.Add(Node.GetElementAttribute('name')); 

      if Node.HasChildren then IterateNodes(Node.FirstChild); 

      Node := Node.NextSibling; 
      until not Assigned(Node); 
     end; 
     begin 
     IterateNodes(doc.Body); 
     end 
    ); 

    ShowMessage(L.Text); 
    finally 
    FreeAndNil(L); 
    end; 
end; 

Ma non ho alcun risultato. Qualche idea?

Grazie

+1

Cosa è successo quando sei passato sotto il debugger? –

+1

Si desidera utilizzare SameText anziché = in modo che il confronto non valga maiuscole/minuscole –

+0

@David, penso che il secondo commento sia la risposta ... – TLama

risposta

3

Con XE2 Update 4

ho capito che il flusso del programma prosegue quando si esegue la procedura parametro in modo che una volta raggiunta la ShowMessage ancora non è stato eseguito questa procedura e quindi la TStringList è vuoto.

Ho messo un controllo di variabile booleano e ha funzionato bene, ma questa non è una soluzione elegante.

Ecco il nuovo codice:

procedure TForm2.Button2Click(Sender: TObject); 
var 
    L: TStringList; 
    Finish: Boolean; 
begin 
    L := TStringList.Create; 
    Finish := False; 

    try 
    Chromium1.Browser.MainFrame.VisitDomProc(
     procedure (const doc: ICefDomDocument) 
     procedure IterateNodes(Node: ICefDomNode); 
     begin 
      if not Assigned(Node) then Exit; 
      repeat 
      if SameText(Node.ElementTagName, 'FORM') then 
      begin 
       L.Add(Node.GetElementAttribute('name')); 
      end; 

      if Node.HasChildren then 
       IterateNodes(Node.FirstChild); 

      Node := Node.NextSibling; 
      until not Assigned(Node); 
     end; 
     begin 
     IterateNodes(doc.Body); 
     Finish := True; 
     end 
    ); 

    repeat Application.ProcessMessages until (Finish); 
    ShowMessage(L.Text); 
    finally 
    FreeAndNil(L); 
    end; 
end; 
+0

Sono sicuro che puoi aspettare qualcosa, o chiedere una richiamata quando l'iterazione è completa. –

+0

Sono aperto a suggerimenti :-) – cadetill

+0

non ho esperienza con questo controllo. Dov'è la documentazione? –

1

sono riuscito a ottenere l'intera pagina come questa:

  1. iniettare un elemento DOM - testo.
ChromiumWB.Browser.MainFrame.ExecuteJavaScript('$("body").prepend(''<input type="text" id="msoftval" value=""/>'')', '', 0); 
  1. utilizzare jQuery o js per ottenere html corpo in elemento iniettato.
mResult := ''; 
ChromiumWB.Browser.MainFrame.ExecuteJavaScript('$("#msoftval").val($("body").html());', '', 0); 
ChromiumWB.Browser.MainFrame.VisitDomProc(getResult); 
while mResult = '' do Application.ProcessMessages; 
Memo1.Text := mResult; 
  1. attendere fino 'VisitDomProc' Fine- rendono sincronizzazione.
procedure TForm44.getResult(const doc: ICefDomDocument); 
var 
    q: ICefDomNode; 
begin 
    q := doc.GetElementById('msoftval'); 
    if Assigned(q) then 
    mResult := q.GetValue 
    else 
    mResult := '-'; 
end; 
Problemi correlati