Как отмечается в этом блоге, основная трудность при Доступ к DOM визуализированной страницы заключается в том, что вы можете сделать это только в том же процессе, что и связанный модуль визуализации для этой страницы.
Вы не можете получить доступ к dom из потока браузера, вы должны сделать это в потоке рендерера.
Во-первых, перенаправьте сообщение (например, visitdom) из процесса браузера в процесс рендеринга.
procedure TMainForm.crmLoadEnd(Sender: TObject; const browser: ICefBrowser;
const frame: ICefFrame; httpStatusCode: Integer);
var
msg : ICefProcessMessage;
begin
if IsMain(browser, frame) then
FLoading := False;
msg := TCefProcessMessageRef.New('visitdom');
browser.SendProcessMessage(PID_RENDERER, msg);
end;
Во-вторых, создайте TCustomRenderProcessHandler для обработки сообщения и отправьте результат обратно процессам браузера.
function TCustomRenderProcessHandler.OnProcessMessageReceived(
const browser: ICefBrowser; sourceProcess: TCefProcessId;
const message: ICefProcessMessage): Boolean;
begin
Result := False;
if (message.Name = 'visitdom') then
begin
browser.MainFrame.VisitDomProc(
procedure(const doc: ICefDomDocument)
function ProcessNode(ANode: ICefDomNode) : String;
var
Node: ICefDomNode;
begin
Result := 'Not Found';
if Assigned(ANode) then
begin
Node := ANode.FirstChild;
while Assigned(Node) do
begin
if Node.ElementTagName='DIV' then
begin
if Node.GetElementAttribute('class')='tv-panels' then
begin
Result := 'Found';
Exit;
end;
end;
ProcessNode(Node);
Node := Node.NextSibling;
end;
end;
end;
var msg : ICefProcessMessage;
begin
msg := TCefProcessMessageRef.New('visitdom');
msg.ArgumentList.SetString(0, processNode(doc.Body));
browser.SendProcessMessage(PID_BROWSER, msg);
end);
Result := True;
end;
end;
В-третьих, в процессе браузера создайте обработчик для обработки сообщения, отправленного обратно из процесса рендеринга.
procedure TMainForm.crmProcessMessageReceived(Sender: TObject;
const browser: ICefBrowser; sourceProcess: TCefProcessId;
const message: ICefProcessMessage; out Result: Boolean);
begin
Result := False;
if (message.Name = 'visitdom') then
begin
StatusBar.SimpleText := message.ArgumentList.GetString(0);
Result := True;
end;
end;
Будьте осторожны, во время отладки установка точки останова в процессе рендеринга никогда не работает. Он никогда не достигнет там.
person
Yongyuth Rootwararit
schedule
12.05.2016
ICefABrowser
иICefAFrame
отсюда). Ваш код ИМХО должен работать, но не работает. Посещение DOM отлично работало в некоторых старых версиях старого Chromium (не v3), и, насколько я помню, в новом снимке старого Chromium это тоже не работает. Я бы предложил сообщить об ошибке (если ее нет) или связаться с автором. Боюсь, я больше ничем не могу вам помочь. - person TLama   schedule 24.01.2013TCefProcessMessageRef
? Я хотел бы пройти запись. - person user3060326   schedule 19.05.2014ArgumentList
, то возможно, но на самом деле возможно, методомSetBinary
. Но я никогда этого не пробовал. Извините, я давно не уходил из CEF... - person TLama   schedule 19.05.2014