powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CEF4Delphi в потоке с внешней формой
139 сообщений из 139, показаны все 6 страниц
CEF4Delphi в потоке с внешней формой
    #39840878
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буду признателен, тем кто работает с CEF3/CEF4 для Delphi за помощь.

Некоторые сайты используют CloudFlare, поэтому простым IdHTTP не обойтись - нужен более менее полноценный и современный браузер с поддержкой js/ajax. А то встроенный древний IE подвисает 21931836 .

Как я уже давно понял, любому браузеру нужна визуальная форма для работы и в потоке без видимой на экране формы он работать не будет.

Поэтому появилась идея вынести загрузку страницы из потока на форму с использованием synchronize. Может быть будет правильнее вместо доступа к форме и браузеру использовать не synchronize, а какие-то другие методы "общения"?
Или вообще реализовать идею без потока. Может хромиум умеет "нажимать" на ссылку как это делает пользователь мышкой?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39840889
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое универсальное решение - отдельный браузер, запущенный в режиме WebDriver. Софт для внутренних нужд или на распространение?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39840891
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На распространиние, правда в "единичном" экземпляре :)


Василий 2браузер, запущенный в режиме WebDriver
это как? что для этого надо?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39840898
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,
В CEF4 можно вызывать любой javascript код, делать инъекции. Загрузил код, вызвал нужные функции.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39840922
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, читал краткую инфу.
но мне всего-то нужно "пробежаться" по страничкам и получить InnerHTML.
InnerHTML уже понял как получать.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39840960
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Василий 2браузер, запущенный в режиме WebDriver
это как? что для этого надо?
Браузер, WebDriver-драйвер (гы) и обвязка REST интерфейса.
Для Хрома, например, http://chromedriver.chromium.org/downloads
Но если просто нужно тыкнуть мышкой, это оверхед. Действительно попробуй CEF, а если нужна параллельность и с потоками не заладится - можно организовать субпроцессы вместо потоков
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39841351
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Часто встречается какой-то "Visitor". Что это такое?

function CookieVisitorProc
CookieVisitor
TCefFastCookieVisitor
OnNavigationVisitorResultAvailable
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39841352
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А есть у кого простой пример работы с куками?
Как задать папку хранения, например?

Т.к. то ,что есть здесь http://parsing-and-i.blogspot.com/2013/01/tchromium-cookies-in-delphi.html
уже устарело
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39841370
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Как задать папку хранения, например?

Код: pascal
1.
GlobalCEFApp.Cache := 


Теперь и кэш, и куки хранятся в общей папке
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39841493
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мало того, все настройки нужно выполнять до строки
GlobalCEFApp.StartMainProcess;

см. пример в файле SimpleBrowser2.dpr
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851555
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ппц :( это сложнее, чем я ожидал

+ 10 в карму, есть поможете понять, как после загрузки страницы найти определённый текст и ссылку, а потом и "щёлкнуть" по ней
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851597
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11ппц :( это сложнее, чем я ожидал

+ 10 в карму, есть поможете понять, как после загрузки страницы найти определённый текст и ссылку, а потом и "щёлкнуть" по ней

1. исходный текст не получается?
2. в тексте не получается найти нужное?
3. в найденном не получается извлечь href?
4. не получается вызвать загрузку по указанному url?

на каком пункте непонимание?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851616
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть примеры процедур SimpleNodeSearch и SimpleDOMIteration в демках. Разбираю их.

Как я понял из примеров и комментариев, нужно использовать OnProcessMessageReceived.
да, я так и делаю:
GlobalCEFApp.OnProcessMessageReceived := GlobalCEFApp_OnProcessMessageReceived;

автор https://www.briskbard.com/forum/viewtopic.php?f=8&t=861&p=3993#p3840 you will need to send messages to the browser process

unit uDOMVisitor// To send messages from the render process you must use the browser.SendProcessMessage
// procedure with a PID_BROWSER parameter. The browser process receives those messages in
// the TChromium.OnProcessMessageReceived event.

Далее. В качестве параметра в SimpleNodeSearch и в SimpleDOMIteration нужно передать aDocument: ICefDomDocument, т.к. обе процедуры принимают его на вход.
Вот тут и начинаются танцы с бубном.
Событие GlobalCEFApp_OnProcessMessageReceived получает и обрабатывает сообщения.
Я знаю, как послать сообщение:
Код: pascal
1.
browser.SendProcessMessage()


Теперь остаётся понять: откуда его правильно посылать?

здесь автор меня запутал
https://www.briskbard.com/forum/viewtopic.php?f=8&t=861&p=3993
то пишет, что нужно:
Код: pascal
1.
frame.SendProcessMessage(PID_BROWSER, msg);


а потом, как я вроде бы понял, это неправильно.

После окончательной загрузки страницы ведь это нужно делать? В каком событии?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851656
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11и в потоке без видимой на экране формы он работать не будет.Что мешает создать оконный цикл в нужном потоке?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851674
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, отсутствие нужных знаний и навыков
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851687
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Разметка произвольная? Может просто тупо внедрить на страницу свой JS и уже с его помощью искать и "кликать" по ссылкам?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851698
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть, я не знаю.
Я пока ещё даже искать не научился.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851727
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне казалось бы какой-то пример работы CEF без визуального рендера.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851730
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эммм, что?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851776
Фотография Saller
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Может быть, я не знаю.
Я пока ещё даже искать не научился.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var links = document.querySelectorAll('a.forumLink');
if (links) {
    for (var x = 0; x <= links.length; x++) {
        if (links[x]) {
            if (links[x].innerHTML.trim().indexOf('Delphi') != -1) {
                links[x].click();               
            }
        }
    }
}
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851778
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это точно для cef4delphi?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851781
Фотография Saller
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Да. Проверял на странице данной темы. Или давай ссылку на сайт, на котором нужно жмякнуть ссылку.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851823
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SallerИли давай ссылку на сайт, на котором нужно жмякнуть ссылку.
Жмакай на сиквел.ру
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851824
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так это ж не дельфи-код
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39851825
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SallerX11,

Да. Проверял на странице данной темы. Или давай ссылку на сайт, на котором нужно жмякнуть ссылку.
doska.plus
...
Рейтинг: 0 / 0
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
CEF4Delphi в потоке с внешней формой
    #39854730
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,
Сформулируй задачу!
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854742
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парсинг сайта в отдельном потоке с использованием Cef4Delphi без дополнительного окна.
По ходу действа искать не только нужный текст, который можно сохранить в базу, но и нужный текст ссылок, по которым нужно кликать, например, чтобы открыть объявление, контакты или вернуться назад и перейти не следующую страницу.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854749
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Парсинг сайта в отдельном потоке с использованием Cef4Delphi без дополнительного окна.
По ходу действа искать не только нужный текст, который можно сохранить в базу, но и нужный текст ссылок, по которым нужно кликать, например, чтобы открыть объявление, контакты или вернуться назад и перейти не следующую страницу.
Зачем парсить сайт в отдельном потоке? Chromium создает несколько процессов для парсинга, тебе этого мало?
Может сделать со скрытым окном?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854755
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Может сделать со скрытым окном?

сейчас это вопрос изучаю
21959107
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854758
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Зачем парсить сайт в отдельном потоке? Chromium создает несколько процессов для парсинга, тебе этого мало?

потому что не хочется создавать новый проект и новую программу, в которой уже есть несколько других работающих парсеров, так сказать оболочка есть и к ней нужно прикрутить ещё один с браузером и чтобы не машать работе пользователя.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854764
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11, Разве примера из DOMVisitor не достаточно?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854765
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SallerX11я не понимаю, что такое скармливай. как, куда?
где, в какой момент?

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



Заходим на страницу объявления и выполняем скрипт.

получилось без окон и панелей загрузить страницу в фоне и выполнить JS

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  constJS =  '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(); ' +
             '         console.log("my click"); ' +
             '      } ' +
             '    } ' +
             '  }' +
             '}';



В итоге в консоль в DevTools попало сообщение "my click"
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854771
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11ziv-2014Зачем парсить сайт в отдельном потоке? Chromium создает несколько процессов для парсинга, тебе этого мало?

потому что не хочется создавать новый проект и новую программу, в которой уже есть несколько других работающих парсеров, так сказать оболочка есть и к ней нужно прикрутить ещё один с браузером и чтобы не машать работе пользователя.
Вы не понимаете, как работает chromium. Там есть очередь обработки сообщений. Все операции выполняются в отдельных потоках. Результат выводится в главный поток для отображения. Все операции, которые происходят внутри, chromium уже распределяет по нужным ему потокам. Если вам надо сделать в отдельном потоке, то вам надо делать окно в отдельном потоке и обрабатывать сообщения этого окна. Но по-моему это большие грабельки.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854773
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014X11, Разве примера из DOMVisitor не достаточно?

Изучаю три примера.

На данный момент волнует вопрос, можно ли управлять общаться с браузером не из главного потока программы, а из дополнительного.
Пока не пробовал. Пока изучаю ...
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39854774
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014Вы не понимаете, как работает chromium.

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


Код: 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.
procedure SimpleNodeSearch(const aDocument: ICefDomDocument; const frame: ICefFrame; const NodeID: string);
var
  TempNode: ICefDomNode;
  msg: ICefProcessMessage;
begin
  try
    if aDocument <> nil then
    begin
      TempNode := aDocument.GetElementById(NodeID);
      msg := TCefProcessMessageRef.New(msg_for_chromium);

      if TempNode <> nil then
      begin
        msg.ArgumentList.SetString(0, 'Node found: ' + NodeID);
        msg.ArgumentList.SetString(1, 'Node name: ' + TempNode.Name);
        msg.ArgumentList.SetString(2, 'ElementInnerText: ' + TempNode.ElementInnerText);
        msg.ArgumentList.SetString(3, 'ElementTagName: ' + TempNode.ElementTagName);

      end
      else
        msg.ArgumentList.SetString(0, 'ERROR. Node not found: ' + NodeID);

      frame.SendProcessMessage(PID_BROWSER, msg);
    end;
  except
    on e : exception do
      if CustomExceptionHandler('SimpleNodeSearch', e) then raise;
  end;
end;



передаю "ad-author-contact-row-content" или "ad-author-contact-row-content j-c-phones" и процедура его не находит.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855153
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Это классы а не id
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855159
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну т.е. с помощью GetElementById не получится?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855178
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

нет
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855212
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок, тогда с помощью чего найти телефон или признак телефона во время итерации по 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.
34.
35.
36.
37.
38.
procedure SimpleDOMIteration(const aDocument: ICefDomDocument; const frame: ICefFrame);
var
  TempHead, TempChild : ICefDomNode;
  msg: ICefProcessMessage;
begin
  try
    if aDocument <> nil then
    begin
        TempHead := aDocument.Body;

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

          while TempChild <> nil do
          begin
            Msg := TCefProcessMessageRef.New(msg_for_chromium);
            if TempChild.ElementInnerText = '' then
            begin
              TempChild := TempChild.NextSibling;
              Continue;
            end;

            msg.ArgumentList.SetString(0, 'name: ' + Trim(TempChild.Name));
            msg.ArgumentList.SetString(1, 'TagName: ' + Trim(TempChild.ElementTagName));
            msg.ArgumentList.SetString(2, 'InnerText: ' + 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;
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855213
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Ну например использовать префикс tel в href
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855217
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovиспользовать префикс tel в href

не понял
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855226
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если на примере цикла итерации по 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
procedure SimpleDOMIteration(const aDocument: ICefDomDocument; const frame: ICefFrame);
var
  TempHead, TempChild : ICefDomNode;
  msg: ICefProcessMessage;
  attrList: TStrings;
begin
  try
    if aDocument <> nil then
    begin
        TempHead := aDocument.Body;

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

          while TempChild <> nil do
          begin
            Msg := TCefProcessMessageRef.New(msg_for_chromium);
            if TempChild.ElementInnerText = '' then
            begin
              TempChild := TempChild.NextSibling;
              Continue;
            end;

            msg.ArgumentList.SetString(0, 'name: ' + Trim(TempChild.Name));
            msg.ArgumentList.SetString(1, 'TagName: ' + Trim(TempChild.ElementTagName));

            attrList := TStringList.Create;
            try
              TempChild.GetElementAttributes(attrList);

              msg.ArgumentList.SetString(2, 'attrList: ' + attrList.Text);
            finally
              attrList.DisposeOf;
            end;

            msg.ArgumentList.SetString(3, 'InnerText: ' + Trim(TempChild.ElementInnerText));
            msg.ArgumentList.SetString(4, '**********************');


            frame.SendProcessMessage(PID_BROWSER, msg);

            TempChild := TempChild.NextSibling;
          end;
        end;
    end;
  except
    on e : exception do
      if CustomExceptionHandler('SimpleDOMIteration', e) then raise;
  end;
end;
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855230
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я ещё не могу понять/найти: в каком свойстве, где живёт то, что на картинке подчеркнуто в программе в ICefDomNode?

Т.е. как выловить, в каком свойстве вот то название класса "ad-author-contact-row-content j-c-phones", чтобы как можно ближе подобраться к телефону.

Т.е. когда я в Firefox выбираю "копировать/внутренний HTML", то копируется:
<span><a href="tel:+xxxxxxx0">+xxxxxxx0</a></span>
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855253
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я забыл про рекурсию
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855571
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11.е. как выловить, в каком свойстве вот то название класса "ad-author-contact-row-content j-c-phones", чтобы как можно ближе подобраться к телефону.

Т.е. когда я в Firefox выбираю "копировать/внутренний HTML", то копируется:

в общем, там ещё есть "TempChild.AsMarkup", т.е. можно использолвать вместо "TempChild.ElementInnerText"
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855632
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Код: pascal
1.
procedure SimpleDOMIteration(



извините за такой вопрос, но сегодня пятница, так что можно


Я не могу понять, обходит ли SimpleDOMIteration() ВСЕ узлы и все уровни дерева DOM или только узлы верхнего уровня? Процедура не является рекурсивной, но вижу заход (TempChild := TempHead.FirstChild) на дочерние узлы.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39855732
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, вот такая конструкция у меня получилась, может кому пригодится.

найти нужный атрибут и значение узла в цикле по 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
procedure StartDOMIteration(const aDocument: ICefDomDocument; const frame: ICefFrame);
var
  TempNode, TempChild : ICefDomNode;
  attrList: TStrings;
  InnerHTMLText, val: string;
begin

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

        if TempNode <> nil then
        begin

          TempChild := TempNode.FirstChild;

          while TempChild <> nil do
          begin
            RecourceDOMIteration(frame, TempChild);

            if SearchNodeAttr(frame, 'class=j-c-phones', TempChild) then
            begin
              SendMessageToBrowser(frame, msg_for_chromium, Trim(TempChild.ElementInnerText));
              exit;
            end;

            TempChild := TempChild.NextSibling;
          end;
        end;

    end;
  except
    on e : exception do
      if CustomExceptionHandler('StartDOMIteration', e) then raise;
  end;
end;

procedure RecourceDOMIteration(const frame: ICefFrame; CefDomNode: ICefDomNode);
var
  TempChild : ICefDomNode;
  attrList: TStrings;
  InnerHTMLText, val: string;
begin
  try
    if CefDomNode <> nil then
    begin
      TempChild := CefDomNode.FirstChild;

      while TempChild <> nil do
      begin
        RecourceDOMIteration(frame, TempChild);

        if SearchNodeAttr(frame, 'class=j-c-phones', TempChild) then
        begin
          SendMessageToBrowser(frame, msg_for_chromium, Trim(TempChild.ElementInnerText));
          exit;
        end;


        TempChild := TempChild.NextSibling;
      end;
    end;

  except
    on e : exception do
      if CustomExceptionHandler('RecourceDOMIteration', e) then raise;
  end;
end;

procedure SendMessageToBrowser(const frame: ICefFrame; const sMsg, sText: string);
var
  msg: ICefProcessMessage;
begin
  Msg := TCefProcessMessageRef.New(sMsg);
  msg.ArgumentList.SetString(0, sText);
  frame.SendProcessMessage(PID_BROWSER, msg);
end;

function SearchNodeAttr(const frame: ICefFrame; const aSearchAttrText: string; const Node: ICefDomNode): boolean;
var
  attrList: TStrings;
  InnerHTMLText, val: string;
begin
  Result := false;

  attrList := TStringList.Create;
  try

    Node.GetElementAttributes(attrList);

    if Trim(attrList.CommaText) = aSearchAttrText then
      Result := True;

  finally
    attrList.DisposeOf;
  end;
end;

...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39856038
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это же жесть -- вручную перебирать всю структуру DOM. Есть всякие css-селекторы, которые простыми командами могут найти и вывести любое количество элементов. Судя по вот этому -- CEF полностью поддерживает querySelectorAll .
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39856066
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это просто один из способов. Тем более, не надо изучать JS.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39856067
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiCEF полностью поддерживает querySelectorAll .

CEF4Delphi поддерживает внедрение JS в страничку
21954002
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39856193
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiЭто же жесть -- вручную перебирать всю структуру DOM.

Хорошо. А как получить в свою программу из документа определённый контент, содержимое той или иной ноды? Но без установки доп. расширений в CEF.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39856214
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11JaDiЭто же жесть -- вручную перебирать всю структуру DOM.

Хорошо. А как получить в свою программу из документа определённый контент, содержимое той или иной ноды? Но без установки доп. расширений в CEF.
Это риторический вопрос в стиле "как из процедуры вернуть результат, не преобразовывая ее в функцию". Хром -- асинхронный. Чтобы что-то из него получить, необходимо дождаться результата. Это можно сделать разными способами -- от eval и extention до вечного while в ожидании появления новых данных в скрытом dom-элементе. См. примеры в "\demos\Delphi_VCL\JavaScript", как там значения возвращаются.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39857088
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вы загружаете скрипт из файла в кодировке UTF-8, то не забудьте перед его внедрением в CEF конвертировать в string:
Код: pascal
1.
s := UTF8ToString(RawByteString(sJsScript));
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39857871
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я правильно понимаю, что
Код: pascal
1.
GlobalCEFApp := TCefApplication.Create;


Создаётся глобально для всей системы, а не только для моей программы и тем более не только для доп. потока(ов) приложения?

Я про то, что когда TChromium (PID_BROWSER) и процесс рендерига (PID_RENDERER) обмениваются между собой сообщениями
Код: pascal
1.
frame.SendProcessMessage();


в сообщении нужно конкретизировать как-то - что и кому предназначено?

Если в приложении несколько потоков, то нужно в каждом потоке и свой экземпляр TChromium создавать? Или TChromium должен быть общим?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39857877
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ведь процесс создания браузера запускается из DPR файла, т.е. непосредственно ещё до старта моего приложения

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure CreateGlobalCEFApp;
begin
//вызов CreateGlobalCEFApp() происходит в dpr

  GlobalCEFApp                            := TCefApplication.Create;
  GlobalCEFApp.OnProcessMessageReceived   := GlobalCEFApp_OnProcessMessageReceived;
  GlobalCEFApp.WindowlessRenderingEnabled := True;
  GlobalCEFApp.EnableHighDPISupport       := True;
  GlobalCEFApp.DisableFeatures            := 'NetworkService,VizDisplayCompositor';
  GlobalCEFApp.FrameworkDirPath           := '...';
  GlobalCEFApp.LocalesDirPath             := '...';
  GlobalCEFApp.ResourcesDirPath           := '...';
  GlobalCEFApp.LogFile                    := '...';
end;



Получается, что процедура GlobalCEFApp_OnProcessMessageReceived ловит сообщения от всех экземпляров TChromium из разных потоков приложения?

Каждый отдельный поток парсит свой отдельный сайт.
Нормально ли будет работать браузер?
Первый поток Chromium1.LoadURL(...);
Загрузка этого сайта даже не завершилась, а тут
Второй поток Chromium2.LoadURL(другой сайт);

нормально ли завершиться загрузка первого сайта?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39857888
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно нормально. Там же асинхронное всё, да еще и в своих собственных процессах крутится.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39857890
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Если в приложении несколько потоков, то нужно в каждом потоке и свой экземпляр TChromium создавать? Или TChromium должен быть общим?

как правильно? или нет разницы?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39857901
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто я собираюсь использовать Chromium в headless режиме и там не будет TCEFWindowParent.

Вот если в приложении несколько вкладок или пользователь сам создает вкладки, как это в классическом браузере, то достаточно одного экземпляра Chromium, как я понимаю?
Просто будет вот так:
Код: pascal
1.
2.
3.
Chromium1.CreateBrowser(CEFWindowParent1, '');
Chromium1.CreateBrowser(CEFWindowParent2, '');
Chromium1.CreateBrowser(CEFWindowParent3, '');



Но у меня-то не будет разных CEFWindowParent.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39857913
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEFWindowParent1 -- это визуальный компонент, где будет идти отрисовка конкретного экземпляра браузера. В соседней же теме было, что для работы в безрендеринговом режиме можно туда nil передавать.

Для потоков должен быть свой собственный браузер TChromium.Create
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39857918
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiCEFWindowParent1 -- это визуальный компонент, где будет идти отрисовка конкретного экземпляра браузера. В соседней же теме было, что для работы в безрендеринговом режиме можно туда nil передавать.

это я всё знаю уже давно
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39857921
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiДля потоков должен быть свой собственный браузер TChromium.Create

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

Ответ был на это:
авторЕсли в приложении несколько потоков, то нужно в каждом потоке и свой экземпляр TChromium создавать? Или TChromium должен быть общим?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39860181
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла проблема в реальной программе.
Программа защищается с помощью ASProtect SKE.
Т.е. где-то в какой-то форме, которая создается по кнопке есть использование сторонней dll.
Так вот, при инициализации CEF`а происходит исключение (exception).
Хотя строка инициализации CEF`а
Код: pascal
1.
CreateGlobalCEFApp;


идёт самой первой после begin в dpr.

Как обойти проблему?

На всякий случай прикреплю код получения HardwareID
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
uses aspr_api;



procedure TfmAbout.FormCreate(Sender: TObject);
begin
  edHid.Text := String(PAnsiChar(GetHardwareID));
end;



в aspr_api.pas есть
Код: pascal
1.
2.
3.
4.
5.
6.
7.
functon  GetHardwareID : PChar; stdcall;
...
...
implementation
...
...
function  GetHardwareID : PChar; external aspr_ide name 'GetHardwareID';



т.е. нужно как-то заставить dll`ку грузиться позже? или....
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39860402
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, у меня всё взлетело и парсинг работает в отдельном потоке без окон, т.е. в режиме headless.

Осталось решить проблему с загрузкой сторонней dll.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39871825
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как получить скриптом то, что всплывает в окне?

Вот мой код, я сделал по принципу, как на других сайтах.
Но функция поиска телефона (FindTel) ищет номер в текущем документе, а нужно в новом окне.

JS
Код: javascript
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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
var intervalHandl;
var tel = "";
var tel1 = "";
var s1 = "Показать номер";
var countTryFindTel = 0;
const cTryFindTel = 4;// 5 попыток для поиска телефона
const constQuerySelectorAll1 = "span.sc-cJSrbW.cHCRbi";
const constQuerySelectorAll2 = "???";

function LOG(sLog){
  console.log((new Date()).toLocaleString() + ": " + sLog);
}

function StartCounting(){   
    LOG("StartСounting start");
    intervalHandl = setInterval(function(){FindTel()}, 3000);
}

function StartGetTel(){
    LOG("StartGetTel");
    var links = document.querySelectorAll(constQuerySelectorAll1);
    if (links) {
      for (var x = 0; x <= links.length; x++) {        
        if (links[x]) { 
          LOG("links[x] = " + x);
          LOG(s1);
          if (links[x].innerText.trim().indexOf(s1) != -1) { 
            links[x].click(); 
            LOG(links[x].innerText);
            
          }
        } 
      }
      StartCounting();
    }
  }
  
  function FindTel(){
    LOG("FindTel");
      if (tel !== "" || countTryFindTel >= cTryFindTel) {
        LOG("clearInterval");
        clearInterval(intervalHandl);
        return;
      }
      else 
        countTryFindTel++;
        
      var links = document.querySelectorAll(constQuerySelectorAll2);
      if (links && links.length > 0) { 
        LOG("links length = " + links.length); 
        for (var x = 0; x <= links.length; x++) { 
          if (links[x]) { 
            LOG(links[x].innerText);
            tel1 = links[x].innerText;
            if (tel == "") 
                tel = tel1
            else
              tel = tel + ", " + tel1
          }
       }
     }
  }
  
  StartGetTel();

...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39871845
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не окно, а просто див, который так же в структуре document сидит. Просто селектор не рабочий
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39871854
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. нужно выяснить, что вставить вместо ??? в
Код: javascript
1.
const constQuerySelectorAll2 = "???";


?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39871860
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашёл div.sc-iwsKbI.kiAeTp a
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39872005
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как получить полностью всю страничку как она есть?
Потому что document.Body.AsMarkup возвращает только часть html-странички.

т.е. приходится клеить document.Head.AsMarkup + document.Body.AsMarkup
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39881522
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, сохранил страничку в текст. А она в кодировке ANSI. Так и должно быть?
Снимок с виндового Блокнота:
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887254
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кто-нибудь пробовал нажать программно на гугловскую рекапчу? Обойти её...
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887328
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подозреваю, если бы это было так просто, то в ней не было бы никакого смысла))
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887338
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не про распознавание картинки.
Иногда рекапча не показывает картинок, нужно просто кликнуть.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887463
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так а в чем проблема-то? Находишь ДОМ элемент, кликаешь.
Только опять же, она не просто так не показывает картинки. Иначе это была бы не каптча. Насколько я знаю, она анализирует действия юзера на страничке, и если он похож на человека, то картинки не показываются
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887473
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, не так всё просто. Там куча событий используется и обрабатывается, в том числе и движение курсора мышки внутри фрейма.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887759
alfangur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11, посмотрите в сторону nwjs или electron либо другую реализацию в виде headless
так вы избавитесь от кучи костылей и получите актуальную версию браузера со всеми новыми фишками V8\JS и т.д.

как вариант:
- запускаете nwjs\eletron\headless приложение
-- окно скрыто по умолчанию, его всегда можно показать при необходимости либо показать нужную часть
- передаете адрес который необходимо посетить
-- получаете уведомление о полной загрузке страницы
- получаете код всей страницы
- выполняете необходимые действия на сайте

P.S. если задач не много могу оказать помощь
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887789
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я только-только более менее начал понимать, как работает Chromium api.
Плюс Chromium - это полноценный браузер с консолью и со встроенными средствами отладки полноценного браузера.
А ты предлагаешь изучать что-то новое. Мало того, ничего полезного я не нагуглил на тему: nwjs + delphi, а на тему Chromium + Delphi информация есть, пусть не так и много, но всё же есть.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887954
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Я только-только более менее начал понимать, как работает Chromium api.
Плюс Chromium - это полноценный браузер с консолью и со встроенными средствами отладки полноценного браузера.
А ты предлагаешь изучать что-то новое. Мало того, ничего полезного я не нагуглил на тему: nwjs + delphi, а на тему Chromium + Delphi информация есть, пусть не так и много, но всё же есть.

Электрон это тот же хромиум. Но Дельфи там, разумеется, никаким боком не применяется. Разве что FPC-шный pas2js присобачить

X11
В общем, не так всё просто. Там куча событий используется и обрабатывается, в том числе и движение курсора мышки внутри фрейма.

Еше бы ))) вопрос был из серии "банкомат требует пин-кода карточки, на что нажать, чтобы его не вводить?"
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887958
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2, не понял, и что?

Ещё раз. Я ничего не нашёл в сети по nwjs + delphi.

Мне что, самому нужно писать обёртку вокруг nwjs?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887968
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На сколько я понял, то Electron и nwjs - это для создания приложений, чтобы отображать веб-контент.
У меня задача немножко другая. Мну нужно парсить сайты.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39888081
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Electron это движок браузера без обвязки, соответственно он позволяет писать приложения на html+js. Ну и отображать сайты, разумеется.
Но в общем случае CEF не имеет особых недостатков по сравнению с предложенным вариантом. Разве что вот каптчу обмануть... можно попробовать мышью над страницей "пошевелить". Но это опять же, с наскоку обмануть кодеров Гугла разве что гений сможет
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915349
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы "выловить" ответ (содержимое) response, приходится использовать монстро-код, но беда не в этом, а в том, что этот код работает на базе виндовых оконных сообщений (Winapi.Messages).
Это я изучаю пример ResponseFilterBrowser.

А у меня браузер работает в потоке, без окон. При чем класс, в котором создаётся и работает парсер и сам браузер не имеет доступа к модулю потока.
Я читал и смотрел примеры по Winapi.Messages в потоках, но там всё основано на том, что код обмена сообщениями находится непосредственно в модуле (в pas-файле) самого потока, в Thread.Execute.

Нет ли более менее простого способа, чтобы заменить Winapi.Messages на что-то другое?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915447
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В потоке вполне себе может быть окно, в чем проблема-то?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915465
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот в чем

X11
Я читал и смотрел примеры по Winapi.Messages в потоках, но там всё основано на том, что код обмена сообщениями находится непосредственно в модуле (в pas-файле) самого потока, в Thread.Execute.


вот пример
https://rsdn.org/forum/delphi/3112311.hot

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TMsgThread.Execute;
var
  msg: TMsg;

begin
  while not Terminated do begin
    if PeekMessage(msg, 0, 0, 0, PM_REMOVE) then begin
      case msg.message of
         WM_USER: Synchronize(Answer);
      end;
    end;
  end;
end;



а мой код работает далеко не в TMsgThread.Execute.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915525
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и не нужно. Создай в начале Thread.Execute окно через AllocateHWnd и твори в обработчике что надо из другого модуля. Или вообще создаешь окно, в конструкторе либо до запуска задавай объект-заглушку, а при получении сообщения вызывай TObject.Dispatch. Преимущество тут в том, что не надо писать WndProc метод, можно задать обработчики как TMsgHandler.Msg_That(var Message); message MSG_THAT
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915551
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,
Что за код? Выложи?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915557
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014, код именно чего?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915560
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, я посмотрел пример использования компоненты TCEFUrlRequestClientComponent.
Добавил модуль TCEFUrlRequestClientComponent и в событии Chromium1.OnResourceResponse запускаю процедуру скачивания, типа:

Код: pascal
1.
2.
3.
4.
5.
  s := UTF8ToString(request.Url);

// вылавливаем нужный URL
  if s.ToLowerInvariant.Contains(fResponsePath.ToLowerInvariant) then
    DownloadRequestDataStart(s);
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915561
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
ziv-2014, код именно чего?

Чтобы "выловить" ответ (содержимое) response, приходится использовать монстро-код, но беда не в этом, а в том, что этот код работает на базе виндовых оконных сообщений (Winapi.Messages).
Это я изучаю пример ResponseFilterBrowser.

Получения ответа response
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915570
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё один вариант мне предложили.
Где-то, в какой-то момент с пом. JS скачивать ещё раз тело ответа и внедрять его прямо в HTML, чтобы парсер видел прямо в теле страницы нужные данные.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39915571
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014
X11
ziv-2014, код именно чего?

Чтобы "выловить" ответ (содержимое) response, приходится использовать монстро-код, но беда не в этом, а в том, что этот код работает на базе виндовых оконных сообщений (Winapi.Messages).
Это я изучаю пример ResponseFilterBrowser.

Получения ответа response

так это стандартный пример, см в папке
CEF4Delphi\demos\Delphi_VCL\ResponseFilterBrowser
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39917267
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
Ну и не нужно. Создай в начале Thread.Execute окно через AllocateHWnd и твори в обработчике что надо из другого модуля.


Дело в том, что у меня как раз всё в другом модуле и работает.
В модуле создания и запуска потока только одно действие в Execute - создание объекта (класса) парсера и старт этого парсера.

В методе Execute нет никаких while ... repeate ... terminate.
Просто выполнить один проход и завершить поток.

вот пример старта парсинга:

Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
type
  TDlThreadXXXXX = class(TDlThread)
  private
    Parser: TParseXXXXX;

  public
    procedure Execute; override;
  end;
  
...
...
...

procedure TDlThreadXXXXX.Execute;
begin

//создать объект класса парсера  
  Parser := TParseXXXXX.Create(proxy, ProfId);

  try
    self.ParserAd           := Parser;
    Parser.OnProgress       := OnSiteParseProgress;

    Parser.ProfileID        := ProfId;
    Parser.StartURL         := StartUrl;

    synchronize(GetfmMainCaption);

    try
        Synchronize(ShowBaloonStartProcess);// уведомление
		
// старт парсинга
        if not Parser.DownloadInProcess then
          Parser.DoParse;

        Synchronize(ShowBaloonEndProcess);// уведомление

    except
      on e:exception do
        raise;

    end;// try except

  finally

    if assigned(Parser) then
    begin
      Parser.Free;
      Parser := nil;
    end;

    if Assigned(dltXXXXX) then
    dltXXXXX := nil;
  end;//try finally
end;



вот там, внутри, под капотом у Parser.DoParse и работает Хромиум.

Т.е. не в этом модуле нужно создавать окно AllocateHWnd и обработку сообщения (PeekMessage), а именно в модуле Parser: TParseXXXXX??? Я правильно понимаю?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39917285
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или где-то внутри Parser: TParseXXXXX нужно создавать ещё один "внутренний" поток и в нем запускать цикл ожидания, получения и обработки сообщений?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39917494
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну стало быть надо залезать внутрь DoParse. Я не очень понял, как у тебя хромиум может "работать через сообщения", если ты его засовываешь в цикл.
Обычная схема работы с выборкой сообщений в потоке - в Execute:

Код: pascal
1.
2.
3.
4.
5.
while not Terminated and GetMessage(Msg, 0, 0) do
case Msg.message of
  MSG_1: ...
  MSG_2: ...
end;



Как там устроен парсер - по названию функции сложно сказать, нужно больше деталей
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39917938
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В DoParse организован тупо цикл whilte true по страницам сайта.


Василий 2
. Я не очень понял, как у тебя хромиум может "работать через сообщения",


А он у меня и не работает через сообщения. Я ж написал вроде, что это в официальном примере получение response-содержимого через сообщения реализовано.
Если у вас установлен Хромиум в Дельфи, откройте и посмотрите (CEF4Delphi\demos\Delphi_VCL\ ResponseFilterBrowser ).

А у меня Хромиум скачивает странички примерно так:
Код: 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.
function TChrom.GetInnerHTMLPage(const url: string): string;
begin
  if fParseAD.MyProgressMsg.Stop then exit;

// обнуляем переменные
  bIsLoadingPage := True;// указываем, что страница грузится, см. ChromiumProcessMessageReceived()
  sInnerHTMLPage := '';
  iFinishedHTMLCount := 0;

// старт процесса загрузки и рендеринга, ответ ждать в ChromiumProcessMessageReceived()
  CefGetUrl(Chromium, url, fParseAD.ProfileName);

// ждём, пока грузится страница в процессе рендеринга
  while bIsLoadingPage do
  begin
    Sleep(3000);

    if fParseAD.MyProgressMsg.Stop then
      break;//выходим из цикла

  end;

  result := sInnerHTMLPage;
end;


Ну там ещё около 10+ разных событий и вспомогательных методов.


Вот я и хочу пример из ResponseFilterBrowser применить для себя.
Может быть есть возможность заменить сообщения на другой вид обмена, т.к. фактически скачивание и получение response-содержимого живет в одном классе, в одном модуле.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39917950
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, что отправку сообщения самому себе можно заменить процедурой ожидания, где будет цикл while true, как в вышеописанном методе GetInnerHTMLPage
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39917977
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, в примере PostMessage просто чтобы не блокировать форму, в случае потока можно заменить на вызовы соответствующих функций
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39920106
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так и не разобрался, что это за WasHidden
Код: pascal
1.
Chromium.WasHidden(True);


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


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  if Chromium.Initialized then
  begin
    Chromium.WasHidden(True);
    Chromium.LoadURL(url);
  end
  else
  begin
    Chromium.CreateBrowser(nil);
    Chromium.WasHidden(True);
    Chromium.LoadURL(url);
  end;
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39920131
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

так красивше
Код: pascal
1.
2.
3.
if not Chromium.Initialized then Chromium.CreateBrowser(nil);
Chromium.WasHidden(True);
Chromium.LoadURL(url);
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39923581
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу понять, почему загрузка стартует только при повторном нажатии на кнопку

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Chromium1.Initialized then
    Chromium1.CreateBrowser(nil);// эта строка выполняется только при первом нажатии

    Chromium1.WasHidden(False);
    Chromium1.SendFocusEvent(True);
    Chromium1.DefaultUrl := edUrl.Text;
    Chromium1.LoadURL(edUrl.Text);
end;



при этом срабатывает событие OnAddressChange и значение url в этот момент About:Blank.

edUrl.Text точно заполнено
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39933608
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу понять, что означает параметр line, для чего он:
Код: pascal
1.
cef_log: procedure(const file_: PAnsiChar; line, severity: Integer; const message_: PAnsiChar); cdecl;



даже здесь не нашёл нормального описания
https://magpcss.org/ceforum/apidocs3/projects/cef.logging/cef_logging.h.html

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
private:
  LogSeverity severity_;
  std::ostringstream stream_;

  // The file and line information passed in to the constructor.
  const char* file_;
  const int line_;



где искать этот конструктор?
конструктор чего именно?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39933673
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Не могу понять, что означает параметр line, для чего он:
[SRC pascal][/SRC]


X11,

конcтруктор класса LogMessage.
А line - это номер строки, где "это" случилось.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39933674
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ааа, line - это я сам должен посмотреть номер строки и этот номер указать?
Прикол в том, что номер строки же постоянно меняется процессе редактирования своих исходников.
По сути, туда можно передавать просто любое число?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39933676
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
ааа, line - это я сам должен посмотреть номер строки в своём pas-файле и этот номер указать?
Прикол в том, что номер строки же постоянно меняется в процессе редактирования своих исходников.
По сути, туда можно передавать просто любое число?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39933683
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

а чего это ты вообще в сишные дела полез? Номер строки в паскаль-файле автоматом поймать можно, но не просто так.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39933715
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что у автора Cef4Delphi описания не нашёл, пришлось лезть в исходники самого движка CEF.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39935395
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос по Chromium.ExecuteJavaScript()

Если скрипт живет в файле и там используются одинарные кавычки в разных местах, то нужно ли JS код заключать в QuotedStr() или нужно каждую кавычку дублировать?
Или загружать как есть?


Код: javascript
1.
document.body.innerHTML += '<div class="phoneB64">' + imgBase64 + '</div>';
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39935423
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, я так понял, что не надо.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39935729
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так понял, на вебсокеты у CEF вообще ничего нет, если не считать серверную часть.
Печально, очень печально.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39935825
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r, это что значит?
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39937436
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Не могу понять, почему загрузка стартует только при повторном нажатии на кнопку


Не могу понять, почему в логах есть записи о загрузке пустой страницы (about:blank).
Как я понял, то при:
Код: pascal
1.
Chromium.CreateBrowser(...);


всё равно стартует загрузка страницы и загружается страница по умолчанию Chromium.DefaultUrl

поэтому правильно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  Chromium.DefaultUrl := url;

  if not Chromium.Initialized then
    Chromium.CreateBrowser(nil);// при инициализации загружается Chromium.DefaultUrl
  end
  else
    Chromium.LoadURL(url);
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39937471
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Vizit0r, это что значит?


это я леплю связку для проксирования пакетов из вебсокетов, чтобы их читать в реальном времени.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39937476
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ого, я всё равно не понял...
ну ладно
...
Рейтинг: 0 / 0
139 сообщений из 139, показаны все 6 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CEF4Delphi в потоке с внешней формой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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