powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CEF4Delphi в потоке с внешней формой
25 сообщений из 139, страница 2 из 6
CEF4Delphi в потоке с внешней формой
    #39851930
Фотография Saller
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11doska.plus
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var links = document.querySelectorAll('a.link-ajax.j-v-contacts-expand-link');
if (links) {
    for (var x = 0; x <= links.length; x++) {
        if (links[x]) {
            if (links[x].innerHTML.trim().indexOf('показать контакты') != -1) {
                links[x].click();               
            }
        }
    }
}
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851931
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так это ж недельфи код
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851939
Фотография Saller
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Так это ж недельфи кодТебе ведь нужно кликнуть на странице по ссылке? Скриптом это сделать проще всего (скармливай скрипт CEF4D). Собрать нужную информацию тоже можно скриптом, но на Делфи это тоже без особых проблем можно сделать. В чем сложность? Может я не правильно понял твою задачу.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851962
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не понимаю, что такое скармливай. как, куда?
где, в какой момент?

Я cef4 только начал изучать
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851963
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SallerМожет я не правильно понял твою задачу.

Задача простая: спарсить параметры объявления + контакты в свою базу
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39852030
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это бессмысленная задача причем даже в ближайшей перспективе :)
Сейчас телефон в текстовом виде, а когда запалитесь он станет в виде картинки, начнете распознавать картинку и он станет с вотермарками и прочими прелестями.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39852059
Фотография Saller
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11я не понимаю, что такое скармливай. как, куда?
где, в какой момент?

Я cef4 только начал изучать
Возьми любую демку CEF4Delphi (например MiniBrowser), добавь туда Memo поле для ввода скрипта и кнопку для выполнения скрипта. В Обработчике клика кнопки прописывает
Код: pascal
1.
Chromium1.Browser.MainFrame.ExecuteJavaScript(Memo1.Text, Chromium1.Browser.MainFrame.Url, 0);


Заходим на страницу объявления и выполняем скрипт.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39852068
Фотография Saller
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39852079
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отлично. Спасибо.

А как узнать, что страница полностью загружена?
Использую OnLoadEnd, но оно срабатывает несколько раз, видать на окончание загрузки каждого фрейма.
но строка
Код: pascal
1.
if frame.IsMain then



всегда возвращает false
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39852116
Фотография Saller
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Отлично. Спасибо.

А как узнать, что страница полностью загружена?
Использую OnLoadEnd, но оно срабатывает несколько раз, видать на окончание загрузки каждого фрейма.
но строка
Код: pascal
1.
if frame.IsMain then




всегда возвращает falseКак вариант в событии OnLoadEnd перечитывать список фреймов и проверять все ли фреймы прогрузились. Но это конечно костыльный вариант, лучше спросить у разраба какие есть варианты определения полной загрузки страницы. Хотя может хватить и загрузки главного фрейма, чтобы начать выполнять свои операции.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39852119
Фотография Saller
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или же в событии LoadingProgressChange дождаться 100% загрузки.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39852125
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в onLoadError появляется ошибка

Chromium1.LoadEnd, frame url: about:blank
Error code:-3 - Error text :'ERR_ABORTED' - URL: https://www.facebook.com/tr/

и на этом, как я понял, дальнейшая загрузка прекращается...
а что сделать, чтобы ошибка игнорировалась и загрузка продолжалась?

Или где и как правильно вставить
Код: pascal
1.
Chromium1.Browser.MainFrame.ExecuteJavaScript(MemoJS.Text, Chromium1.Browser.MainFrame.Url, 0);
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39852126
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

проскакивал тут как-то интересный топик с (мне тогда) неизвестным термином "HeadLess browser": Delphi + HeadLess браузер . Может поможет как-нибудь ...
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39852337
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Безголовый браузер и код на ноде или яве - это наилучшее решение по безгеморройности и быстроте написания.
Но если это не вариант, то внедрение на страницу своего скрипта будет очень хорошим и гибким вариантом. Скрипт можно класть рядом с программой и менять без пересборки, а из js жонглировать DOM объектами куда проще, чем из интерфейса обертки.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39853491
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, а у браузера есть возможность получить InnerHTML?
Я почитал: https://www.briskbard.com/forum/viewtopic.php?t=157#p567
дык там нужно такой... огород городить приходится О_о

Ну т.е. нет ли чего-нибудь типа Chromium1.Browser.MainFrame.InnerHTML?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39853508
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

в LoadEnd
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
if (frame <> nil) and frame.IsMain then
    begin
      frame.GetSourceProc(crmLoadEndcallback);
    end;



procedure crmLoadEndcallback(const str: ustring);
begin
 str = исходный текст ...
end;
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39853509
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а ... InnerHTML ... напутал..)
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39853511
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё вопрос по примеру DOMVisitor.

В процедуре GlobalCEFApp_OnProcessMessageReceived есть возможность обратиться к фреймам. Хочу сделать цикл по фреймам, но FrameCount возвращает 0 и CefFrameIdentifierArray тоже нулевого размера.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var
  FrameCount: NativeUInt;
  CefFrameIdentifierArray: TCefFrameIdentifierArray;
begin
...
...
  browser.GetFrameIdentifiers(FrameCount, CefFrameIdentifierArray);
  
  CefLog('CEF4Delphi', 1, CEF_LOG_SEVERITY_INFO, 'browser.FrameCount: ' + FrameCount.ToString);
  CefLog('CEF4Delphi', 1, CEF_LOG_SEVERITY_INFO, 'CefFrameIdentifierArray: ' + Length(CefFrameIdentifierArray).ToString);


Что я делаю не так?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39853513
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при этом
Код: pascal
1.
browser.FrameCount


возвращает 3
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39853516
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дошло, нужно
TempHead := aDocument.Body;
вместо
TempHead := aDocument.Head;
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39853825
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак... чтобы кликнуть на ссылку и потом получить текст страницы нужно примерно такие действия.
Делал на примере MiniBrowser.

В событии TChromium1 OnLoadEnd отправляем сообщение процесу рендеринга:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure TMiniBrowserFrm.Chromium1LoadEnd(Sender: TObject;
  const browser: ICefBrowser; const frame: ICefFrame;
  httpStatusCode: Integer);
var
  TempMsg: ICefProcessMessage;
begin

  if frame.IsMain then
  begin
    Memo1.Lines.Add('main frame load end: ' + TimeToStr(now));
    Chromium1.Browser.MainFrame.ExecuteJavaScript(MemoJS.Text, Chromium1.Browser.MainFrame.Url, 0);

    // Use the ArgumentList property if you need to pass some parameters.
    TempMsg := TCefProcessMessageRef.New(MSG3);// в MSG3 какой-то текст, в которому будем ловить сообщение в процедуре GlobalCEFApp_OnProcessMessageReceived()
    frame.SendProcessMessage(PID_RENDERER, TempMsg);// сообщение для процесса рендеринга
  end;
end;



В событии GlobalCEFApp.OnProcessMessageReceived ловим это сообщение:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
procedure GlobalCEFApp_OnProcessMessageReceived(const browser       : ICefBrowser;
                                                const frame         : ICefFrame;
                                                      sourceProcess : TCefProcessId;
                                                const message       : ICefProcessMessage;
                                                var   aHandled      : boolean);
VAR
  TempVisitor : TCefFastDomVisitor2;
begin
  aHandled := False;
  CefLog('CEF4Delphi', 1, CEF_LOG_SEVERITY_INFO, 'GlobalCEFApp_OnProcessMessageReceived');
  if browser <> nil then
  begin
    CefLog('CEF4Delphi', 1, CEF_LOG_SEVERITY_INFO, 'message.name = ' + message.name);

    if message.name = MSG3 then
    begin
      TempVisitor := TCefFastDomVisitor2.Create(browser, Frame, DOMVisitor_OnDocAvailableSearch);
      frame.VisitDom(TempVisitor);
    end;
  end;

  aHandled := True;
end;




В процедуре DOMVisitor_OnDocAvailableSearch есть доступ к ICefDomDocument, именно он и нужен для итерации по DOM:
Код: pascal
1.
2.
3.
4.
5.
procedure DOMVisitor_OnDocAvailableSearch(const browser: ICefBrowser; const frame: ICefFrame; const document: ICefDomDocument);
begin
  CefLog('CEF4Delphi', 1, CEF_LOG_SEVERITY_INFO, 'DOMVisitor_OnDocAvailableSearch');
  SimpleDOMIteration(document, frame);// frame передаем для того, чтобы отправить сообщение обратно в TChromium
end;



Цикл по DOMу
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
procedure SimpleDOMIteration(const aDocument: ICefDomDocument; const frame: ICefFrame);
var
  TempHead, TempChild : ICefDomNode;
  msg: ICefProcessMessage;
begin
  CefLog('CEF4Delphi', 1, CEF_LOG_SEVERITY_INFO, 'SimpleDOMIteration');

  try
    if aDocument <> nil then
    begin
        TempHead := aDocument.Body;

        if TempHead <> nil then
        begin
          TempChild := TempHead.FirstChild;

          while TempChild <> nil do
          begin
            CefLog('CEF4Delphi', 1, CEF_LOG_SEVERITY_INFO, 'Head child element : ' + TempChild.Name + ', ElementInnerText: ' + Trim(TempChild.ElementInnerText));
// отправляем сообщение обратно в TChromium
            Msg := TCefProcessMessageRef.New(msg2);
            msg.ArgumentList.SetString(0, 'TempChild.ElementInnerText: ' + Trim(TempChild.ElementInnerText));
            frame.SendProcessMessage(PID_BROWSER, msg);

            TempChild := TempChild.NextSibling;
          end;
        end;
    end;
  except
    on e : exception do
      if CustomExceptionHandler('SimpleDOMIteration', e) then raise;
  end;
end;




отправляем в TMemo то, что прилетело из глобального процесса-рендеринга в message
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure TMiniBrowserFrm.Chromium1ProcessMessageReceived(Sender: TObject;
  const browser: ICefBrowser; const frame: ICefFrame;
  sourceProcess: TCefProcessId; const message: ICefProcessMessage;
  out Result: Boolean);
begin
  Memo1.Lines.Add('Chromium1ProcessMessageReceived-1');

  Result := False;
  if (message = nil) or (message.ArgumentList = nil) then exit;

  Memo1.Lines.Add(message.Name);

  if message.Name = MSG2 then
  begin
    Memo1.Lines.Add(MSG2);
    Memo1.Lines.Add(message.ArgumentList.GetString(0));// данные здесь
  end;

  Result := True;
end;
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39853846
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VisitDom работает только в процессе, который занимается рендерингом
Код: pascal
1.
frame.VisitDom(TempVisitor);



Поэтому DOMVisitor_OnDocAvailableSearch и SimpleDOMIteration бесполезно вызывать из своего приложения.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39853847
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пока так и не понял, что такое TCefFastDomVisitor2 и с чем его едят как и где правильно его использовать.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854526
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посоветуйте, как лучше и правильней организовать парсинг в потоке с видимым окном.
Как из потока обращаться к окну, где будет работать компоненты TChromium + TCEFWindowParent? Нужно же обмениваться данными и не просто в 10-20 символов.
Просто Syncronize не подойдет, должна же быть какая-то взаимосвязь, отдача, очередь, синхронность?

Хоть с чего начать?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854565
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

а что не так с Synchronize? Если туда передать объект, то можно и данными обмениваться.

Можно через SendMessage передать указатель на объект.
...
Рейтинг: 0 / 0
25 сообщений из 139, страница 2 из 6
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CEF4Delphi в потоке с внешней формой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]