Chromium:如何获取所有形式的加载页面

时间:2012-10-12 20:26:46

标签: delphi chromium tchromium

我尝试获取所有加载页面形式的名称。我这样做了:

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;

但我没有任何结果。有什么想法吗?

由于

2 个答案:

答案 0 :(得分:3)

使用XE2 Update 4

我已经意识到程序流在运行procedure参数时会继续运行,因此在到达ShowMessage时仍然没有运行此过程,因此TStringList为空。

我已经放置了一个布尔变量控件,它运行正常,但这不是一个优雅的解决方案。

这里是新代码:

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;

答案 1 :(得分:1)

我设法得到了这样的整个页面:

  1. 注入DOM元素 - 文本。
  2. ChromiumWB.Browser.MainFrame.ExecuteJavaScript('$("body").prepend(''<input type="text" id="msoftval" value=""/>'')', '', 0);
    
    1. 使用jquery或js将body html转换为注入元素。
    2. mResult := '';
      ChromiumWB.Browser.MainFrame.ExecuteJavaScript('$("#msoftval").val($("body").html());', '', 0);
      ChromiumWB.Browser.MainFrame.VisitDomProc(getResult);
      while mResult = '' do Application.ProcessMessages;
      Memo1.Text := mResult;
      
      1. 等到直到&#39; VisitDomProc&#39;完成 - 让它同步。
      2. procedure TForm44.getResult(const doc: ICefDomDocument);
        var
          q: ICefDomNode;
        begin
          q := doc.GetElementById('msoftval');
          if Assigned(q) then
            mResult := q.GetValue
          else
            mResult := '-';
        end;