Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4 5      [все]
 CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Буду признателен, тем кто работает с CEF3/CEF4 для Delphi за помощь.

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

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

Поэтому появилась идея вынести загрузку страницы из потока на форму с использованием synchronize. Может быть будет правильнее вместо доступа к форме и браузеру использовать не synchronize, а какие-то другие методы "общения"?
Или вообще реализовать идею без потока. Может хромиум умеет "нажимать" на ссылку как это делает пользователь мышкой?
24 июл 19, 11:50    [21933393]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 911
Самое универсальное решение - отдельный браузер, запущенный в режиме WebDriver. Софт для внутренних нужд или на распространение?
24 июл 19, 12:03    [21933415]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
На распространиние, правда в "единичном" экземпляре :)


Василий 2
браузер, запущенный в режиме WebDriver

это как? что для этого надо?
24 июл 19, 12:05    [21933419]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
ziv-2014
Member

Откуда:
Сообщений: 476
X11,
В CEF4 можно вызывать любой javascript код, делать инъекции. Загрузил код, вызвал нужные функции.
24 июл 19, 12:13    [21933437]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Да, читал краткую инфу.
но мне всего-то нужно "пробежаться" по страничкам и получить InnerHTML.
InnerHTML уже понял как получать.
24 июл 19, 12:58    [21933489]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 911
X11
Василий 2
браузер, запущенный в режиме WebDriver

это как? что для этого надо?

Браузер, WebDriver-драйвер (гы) и обвязка REST интерфейса.
Для Хрома, например, http://chromedriver.chromium.org/downloads
Но если просто нужно тыкнуть мышкой, это оверхед. Действительно попробуй CEF, а если нужна параллельность и с потоками не заладится - можно организовать субпроцессы вместо потоков
24 июл 19, 14:15    [21933569]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Часто встречается какой-то "Visitor". Что это такое?

function CookieVisitorProc
CookieVisitor
TCefFastCookieVisitor
OnNavigationVisitorResultAvailable
25 июл 19, 13:00    [21934276]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
А есть у кого простой пример работы с куками?
Как задать папку хранения, например?

Т.к. то ,что есть здесь http://parsing-and-i.blogspot.com/2013/01/tchromium-cookies-in-delphi.html
уже устарело
25 июл 19, 13:01    [21934277]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
X11
Как задать папку хранения, например?


GlobalCEFApp.Cache := 

Теперь и кэш, и куки хранятся в общей папке
25 июл 19, 13:25    [21934317]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Мало того, все настройки нужно выполнять до строки
GlobalCEFApp.StartMainProcess;

см. пример в файле SimpleBrowser2.dpr
25 июл 19, 16:13    [21934573]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
ппц :( это сложнее, чем я ожидал

+ 10 в карму, есть поможете понять, как после загрузки страницы найти определённый текст и ссылку, а потом и "щёлкнуть" по ней
20 авг 19, 12:58    [21953359]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
sql2012
Member

Откуда: РФ
Сообщений: 742
X11
ппц :( это сложнее, чем я ожидал

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


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

на каком пункте непонимание?
20 авг 19, 13:54    [21953446]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Есть примеры процедур 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 получает и обрабатывает сообщения.
Я знаю, как послать сообщение:
browser.SendProcessMessage()

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

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

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

После окончательной загрузки страницы ведь это нужно делать? В каком событии?

К сообщению приложен файл. Размер - 3Kb
20 авг 19, 14:13    [21953467]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11401
X11
и в потоке без видимой на экране формы он работать не будет.
Что мешает создать оконный цикл в нужном потоке?
20 авг 19, 15:03    [21953526]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Да, отсутствие нужных знаний и навыков Картинка с другого сайта.
20 авг 19, 15:19    [21953547]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6249
X11,

Разметка произвольная? Может просто тупо внедрить на страницу свой JS и уже с его помощью искать и "кликать" по ссылкам?
20 авг 19, 15:37    [21953561]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Может быть, я не знаю.
Я пока ещё даже искать не научился.
20 авг 19, 15:50    [21953574]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1061
Мне казалось бы какой-то пример работы CEF без визуального рендера.
20 авг 19, 16:18    [21953612]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
эммм, что?
20 авг 19, 16:19    [21953615]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1135
X11
Может быть, я не знаю.
Я пока ещё даже искать не научился.

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();               
            }
        }
    }
}
20 авг 19, 17:06    [21953675]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
это точно для cef4delphi?
20 авг 19, 17:08    [21953678]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1135
X11,

Да. Проверял на странице данной темы. Или давай ссылку на сайт, на котором нужно жмякнуть ссылку.
20 авг 19, 17:11    [21953682]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Gator
Member

Откуда: Москва
Сообщений: 14978
Saller
Или давай ссылку на сайт, на котором нужно жмякнуть ссылку.

Жмакай на сиквел.ру
20 авг 19, 19:46    [21953770]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
так это ж не дельфи-код
20 авг 19, 19:48    [21953771]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Saller
X11,

Да. Проверял на странице данной темы. Или давай ссылку на сайт, на котором нужно жмякнуть ссылку.

doska.plus
20 авг 19, 19:49    [21953772]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1135
X11
doska.plus

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();               
            }
        }
    }
}
21 авг 19, 09:38    [21954002]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Так это ж недельфи код
21 авг 19, 09:44    [21954004]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1135
X11
Так это ж недельфи код
Тебе ведь нужно кликнуть на странице по ссылке? Скриптом это сделать проще всего (скармливай скрипт CEF4D). Собрать нужную информацию тоже можно скриптом, но на Делфи это тоже без особых проблем можно сделать. В чем сложность? Может я не правильно понял твою задачу.
21 авг 19, 09:59    [21954013]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
я не понимаю, что такое скармливай. как, куда?
где, в какой момент?

Я cef4 только начал изучать
21 авг 19, 10:29    [21954051]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Saller
Может я не правильно понял твою задачу.


Задача простая: спарсить параметры объявления + контакты в свою базу
21 авг 19, 10:30    [21954053]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1061
Это бессмысленная задача причем даже в ближайшей перспективе :)
Сейчас телефон в текстовом виде, а когда запалитесь он станет в виде картинки, начнете распознавать картинку и он станет с вотермарками и прочими прелестями.
21 авг 19, 11:50    [21954181]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1135
X11
я не понимаю, что такое скармливай. как, куда?
где, в какой момент?

Я cef4 только начал изучать

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

Заходим на страницу объявления и выполняем скрипт.
21 авг 19, 12:40    [21954271]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1135


К сообщению приложен файл. Размер - 99Kb
21 авг 19, 12:47    [21954287]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Отлично. Спасибо.

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


всегда возвращает false
21 авг 19, 13:01    [21954316]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1135
X11
Отлично. Спасибо.

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



всегда возвращает false
Как вариант в событии OnLoadEnd перечитывать список фреймов и проверять все ли фреймы прогрузились. Но это конечно костыльный вариант, лучше спросить у разраба какие есть варианты определения полной загрузки страницы. Хотя может хватить и загрузки главного фрейма, чтобы начать выполнять свои операции.
21 авг 19, 14:05    [21954412]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1135
Или же в событии LoadingProgressChange дождаться 100% загрузки.
21 авг 19, 14:08    [21954417]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
в onLoadError появляется ошибка

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


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

Или где и как правильно вставить
Chromium1.Browser.MainFrame.ExecuteJavaScript(MemoJS.Text, Chromium1.Browser.MainFrame.Url, 0);
21 авг 19, 14:14    [21954426]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6591
X11,

проскакивал тут как-то интересный топик с (мне тогда) неизвестным термином "HeadLess browser": Delphi + HeadLess браузер. Может поможет как-нибудь ...
21 авг 19, 14:14    [21954427]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 911
Безголовый браузер и код на ноде или яве - это наилучшее решение по безгеморройности и быстроте написания.
Но если это не вариант, то внедрение на страницу своего скрипта будет очень хорошим и гибким вариантом. Скрипт можно класть рядом с программой и менять без пересборки, а из js жонглировать DOM объектами куда проще, чем из интерфейса обертки.
21 авг 19, 18:52    [21954765]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Подскажите, а у браузера есть возможность получить InnerHTML?
Я почитал: https://www.briskbard.com/forum/viewtopic.php?t=157#p567
дык там нужно такой... огород городить приходится О_о

Ну т.е. нет ли чего-нибудь типа Chromium1.Browser.MainFrame.InnerHTML?
24 авг 19, 16:16    [21956982]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
sql2012
Member

Откуда: РФ
Сообщений: 742
X11,

в LoadEnd
if (frame <> nil) and frame.IsMain then
    begin
      frame.GetSourceProc(crmLoadEndcallback);
    end;



procedure crmLoadEndcallback(const str: ustring);
begin
 str = исходный текст ...
end;
24 авг 19, 20:44    [21957044]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
sql2012
Member

Откуда: РФ
Сообщений: 742
а ... InnerHTML ... напутал..)
24 авг 19, 20:45    [21957045]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Ещё вопрос по примеру DOMVisitor.

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

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);

Что я делаю не так?
24 авг 19, 21:07    [21957050]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
при этом
browser.FrameCount

возвращает 3
24 авг 19, 21:18    [21957053]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
дошло, нужно
TempHead := aDocument.Body;
вместо
TempHead := aDocument.Head;
24 авг 19, 22:27    [21957074]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Итак... чтобы кликнуть на ссылку и потом получить текст страницы нужно примерно такие действия.
Делал на примере MiniBrowser.

В событии TChromium1 OnLoadEnd отправляем сообщение процесу рендеринга:
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 ловим это сообщение:
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:
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у
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
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;
26 авг 19, 17:34    [21957795]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
VisitDom работает только в процессе, который занимается рендерингом
frame.VisitDom(TempVisitor);


Поэтому DOMVisitor_OnDocAvailableSearch и SimpleDOMIteration бесполезно вызывать из своего приложения.
26 авг 19, 18:06    [21957824]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Я пока так и не понял, что такое TCefFastDomVisitor2 и с чем его едят как и где правильно его использовать.
26 авг 19, 18:07    [21957826]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Посоветуйте, как лучше и правильней организовать парсинг в потоке с видимым окном.
Как из потока обращаться к окну, где будет работать компоненты TChromium + TCEFWindowParent? Нужно же обмениваться данными и не просто в 10-20 символов.
Просто Syncronize не подойдет, должна же быть какая-то взаимосвязь, отдача, очередь, синхронность?

Хоть с чего начать?
28 авг 19, 11:22    [21958892]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1401
X11,

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

Можно через SendMessage передать указатель на объект.
28 авг 19, 12:18    [21958969]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
ziv-2014
Member

Откуда:
Сообщений: 476
X11,
Сформулируй задачу!
28 авг 19, 16:01    [21959207]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Парсинг сайта в отдельном потоке с использованием Cef4Delphi без дополнительного окна.
По ходу действа искать не только нужный текст, который можно сохранить в базу, но и нужный текст ссылок, по которым нужно кликать, например, чтобы открыть объявление, контакты или вернуться назад и перейти не следующую страницу.
28 авг 19, 16:11    [21959222]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
ziv-2014
Member

Откуда:
Сообщений: 476
X11
Парсинг сайта в отдельном потоке с использованием Cef4Delphi без дополнительного окна.
По ходу действа искать не только нужный текст, который можно сохранить в базу, но и нужный текст ссылок, по которым нужно кликать, например, чтобы открыть объявление, контакты или вернуться назад и перейти не следующую страницу.

Зачем парсить сайт в отдельном потоке? Chromium создает несколько процессов для парсинга, тебе этого мало?
Может сделать со скрытым окном?
28 авг 19, 16:21    [21959234]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
ziv-2014
Может сделать со скрытым окном?


сейчас это вопрос изучаю
21959107
28 авг 19, 16:27    [21959245]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
ziv-2014
Зачем парсить сайт в отдельном потоке? Chromium создает несколько процессов для парсинга, тебе этого мало?


потому что не хочется создавать новый проект и новую программу, в которой уже есть несколько других работающих парсеров, так сказать оболочка есть и к ней нужно прикрутить ещё один с браузером и чтобы не машать работе пользователя.
28 авг 19, 16:29    [21959248]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
ziv-2014
Member

Откуда:
Сообщений: 476
X11, Разве примера из DOMVisitor не достаточно?
28 авг 19, 16:35    [21959254]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Saller
X11
я не понимаю, что такое скармливай. как, куда?
где, в какой момент?

Я cef4 только начал изучать

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


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


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

  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"
28 авг 19, 16:36    [21959256]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
ziv-2014
Member

Откуда:
Сообщений: 476
X11
ziv-2014
Зачем парсить сайт в отдельном потоке? Chromium создает несколько процессов для парсинга, тебе этого мало?


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

Вы не понимаете, как работает chromium. Там есть очередь обработки сообщений. Все операции выполняются в отдельных потоках. Результат выводится в главный поток для отображения. Все операции, которые происходят внутри, chromium уже распределяет по нужным ему потокам. Если вам надо сделать в отдельном потоке, то вам надо делать окно в отдельном потоке и обрабатывать сообщения этого окна. Но по-моему это большие грабельки.
28 авг 19, 16:40    [21959262]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
ziv-2014
X11, Разве примера из DOMVisitor не достаточно?


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

На данный момент волнует вопрос, можно ли управлять общаться с браузером не из главного потока программы, а из дополнительного.
Пока не пробовал. Пока изучаю ...
28 авг 19, 16:42    [21959265]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
ziv-2014
Вы не понимаете, как работает chromium.


не спорю, поэтому и пытаюсь изучать и понять. К сожалению инфы на русском мало.
28 авг 19, 16:42    [21959266]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Подскажите, а что нужно указывать в качестве NodeID?


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" и процедура его не находит.

К сообщению приложен файл. Размер - 13Kb
29 авг 19, 13:52    [21959833]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
asviridenkov
Member

Откуда:
Сообщений: 3963
X11,

Это классы а не id
29 авг 19, 13:58    [21959839]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Ну т.е. с помощью GetElementById не получится?
29 авг 19, 14:04    [21959847]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
asviridenkov
Member

Откуда:
Сообщений: 3963
X11,

нет
29 авг 19, 14:29    [21959870]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
ок, тогда с помощью чего найти телефон или признак телефона во время итерации по DOM?

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;
29 авг 19, 15:07    [21959915]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
asviridenkov
Member

Откуда:
Сообщений: 3963
X11,

Ну например использовать префикс tel в href
29 авг 19, 15:09    [21959916]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
asviridenkov
использовать префикс tel в href


не понял
29 авг 19, 15:13    [21959921]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Если на примере цикла итерации по DOM, то как?

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;
29 авг 19, 15:19    [21959930]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Я ещё не могу понять/найти: в каком свойстве, где живёт то, что на картинке подчеркнуто в программе в ICefDomNode?

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

Т.е. когда я в Firefox выбираю "копировать/внутренний HTML", то копируется:
<span><a href="tel:+xxxxxxx0">+xxxxxxx0</a></span>


К сообщению приложен файл. Размер - 4Kb
29 авг 19, 15:24    [21959935]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
я забыл про рекурсию
29 авг 19, 15:59    [21959966]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

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

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


в общем, там ещё есть "TempChild.AsMarkup", т.е. можно использолвать вместо "TempChild.ElementInnerText"
30 авг 19, 12:04    [21960433]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
X11
procedure SimpleDOMIteration(


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

Я не могу понять, обходит ли SimpleDOMIteration() ВСЕ узлы и все уровни дерева DOM или только узлы верхнего уровня? Процедура не является рекурсивной, но вижу заход (TempChild := TempHead.FirstChild) на дочерние узлы.
30 авг 19, 13:20    [21960514]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
В общем, вот такая конструкция у меня получилась, может кому пригодится.

+ найти нужный атрибут и значение узла в цикле по DOM
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;
30 авг 19, 15:48    [21960672]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 4120
Это же жесть -- вручную перебирать всю структуру DOM. Есть всякие css-селекторы, которые простыми командами могут найти и вывести любое количество элементов. Судя по вот этому -- CEF полностью поддерживает querySelectorAll.
31 авг 19, 22:43    [21961333]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Это просто один из способов. Тем более, не надо изучать JS.
1 сен 19, 09:50    [21961400]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
JaDi
CEF полностью поддерживает querySelectorAll.


CEF4Delphi поддерживает внедрение JS в страничку
21954002
1 сен 19, 09:52    [21961401]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
JaDi
Это же жесть -- вручную перебирать всю структуру DOM.


Хорошо. А как получить в свою программу из документа определённый контент, содержимое той или иной ноды? Но без установки доп. расширений в CEF.
2 сен 19, 10:24    [21961665]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 4120
X11
JaDi
Это же жесть -- вручную перебирать всю структуру DOM.


Хорошо. А как получить в свою программу из документа определённый контент, содержимое той или иной ноды? Но без установки доп. расширений в CEF.

Это риторический вопрос в стиле "как из процедуры вернуть результат, не преобразовывая ее в функцию". Хром -- асинхронный. Чтобы что-то из него получить, необходимо дождаться результата. Это можно сделать разными способами -- от eval и extention до вечного while в ожидании появления новых данных в скрытом dom-элементе. См. примеры в "\demos\Delphi_VCL\JavaScript", как там значения возвращаются.
2 сен 19, 11:30    [21961727]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Если вы загружаете скрипт из файла в кодировке UTF-8, то не забудьте перед его внедрением в CEF конвертировать в string:
s := UTF8ToString(RawByteString(sJsScript));
4 сен 19, 12:30    [21963276]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Я правильно понимаю, что
GlobalCEFApp := TCefApplication.Create;

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

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

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

Если в приложении несколько потоков, то нужно в каждом потоке и свой экземпляр TChromium создавать? Или TChromium должен быть общим?
5 сен 19, 13:06    [21964474]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
ведь процесс создания браузера запускается из DPR файла, т.е. непосредственно ещё до старта моего приложения

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(другой сайт);

нормально ли завершиться загрузка первого сайта?
5 сен 19, 13:14    [21964484]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 4120
Конечно нормально. Там же асинхронное всё, да еще и в своих собственных процессах крутится.
5 сен 19, 13:31    [21964516]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
X11
Если в приложении несколько потоков, то нужно в каждом потоке и свой экземпляр TChromium создавать? Или TChromium должен быть общим?


как правильно? или нет разницы?
5 сен 19, 13:32    [21964519]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Просто я собираюсь использовать Chromium в headless режиме и там не будет TCEFWindowParent.

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


Но у меня-то не будет разных CEFWindowParent.
5 сен 19, 13:39    [21964536]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 4120
CEFWindowParent1 -- это визуальный компонент, где будет идти отрисовка конкретного экземпляра браузера. В соседней же теме было, что для работы в безрендеринговом режиме можно туда nil передавать.

Для потоков должен быть свой собственный браузер TChromium.Create
5 сен 19, 14:00    [21964571]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
JaDi
CEFWindowParent1 -- это визуальный компонент, где будет идти отрисовка конкретного экземпляра браузера. В соседней же теме было, что для работы в безрендеринговом режиме можно туда nil передавать.


это я всё знаю уже давно
5 сен 19, 14:09    [21964579]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
JaDi
Для потоков должен быть свой собственный браузер TChromium.Create


Вы не понимаете мои вопросы?
5 сен 19, 14:09    [21964582]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 4120
X11
Вы не понимаете мои вопросы?


Ответ был на это:
автор
Если в приложении несколько потоков, то нужно в каждом потоке и свой экземпляр TChromium создавать? Или TChromium должен быть общим?
5 сен 19, 14:16    [21964592]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Возникла проблема в реальной программе.
Программа защищается с помощью ASProtect SKE.
Т.е. где-то в какой-то форме, которая создается по кнопке есть использование сторонней dll.
Так вот, при инициализации CEF`а происходит исключение (exception).
Хотя строка инициализации CEF`а
CreateGlobalCEFApp;

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

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

На всякий случай прикреплю код получения HardwareID
uses aspr_api;



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


в aspr_api.pas есть
functon  GetHardwareID : PChar; stdcall;
...
...
implementation
...
...
function  GetHardwareID : PChar; external aspr_ide name 'GetHardwareID';


т.е. нужно как-то заставить dll`ку грузиться позже? или....
11 сен 19, 10:46    [21968343]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
В принципе, у меня всё взлетело и парсинг работает в отдельном потоке без окон, т.е. в режиме headless.

Осталось решить проблему с загрузкой сторонней dll.
11 сен 19, 16:17    [21968652]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
А как получить скриптом то, что всплывает в окне?

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

+ JS
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();


К сообщению приложен файл. Размер - 36Kb
4 окт 19, 17:55    [21987009]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 911
Это не окно, а просто див, который так же в структуре document сидит. Просто селектор не рабочий
4 окт 19, 18:27    [21987046]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
т.е. нужно выяснить, что вставить вместо ??? в
const constQuerySelectorAll2 = "???";

?
4 окт 19, 18:43    [21987063]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
нашёл div.sc-iwsKbI.kiAeTp a
4 окт 19, 18:52    [21987071]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
А как получить полностью всю страничку как она есть?
Потому что document.Body.AsMarkup возвращает только часть html-странички.

т.е. приходится клеить document.Head.AsMarkup + document.Body.AsMarkup
5 окт 19, 12:16    [21987292]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Странно, сохранил страничку в текст. А она в кодировке ANSI. Так и должно быть?
Снимок с виндового Блокнота:

К сообщению приложен файл. Размер - 4Kb
25 окт 19, 13:14    [22002503]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
А кто-нибудь пробовал нажать программно на гугловскую рекапчу? Обойти её...
10 ноя 19, 23:25    [22013155]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 911
Подозреваю, если бы это было так просто, то в ней не было бы никакого смысла))
11 ноя 19, 10:02    [22013284]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Я не про распознавание картинки.
Иногда рекапча не показывает картинок, нужно просто кликнуть.
11 ноя 19, 10:18    [22013305]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 911
Так а в чем проблема-то? Находишь ДОМ элемент, кликаешь.
Только опять же, она не просто так не показывает картинки. Иначе это была бы не каптча. Насколько я знаю, она анализирует действия юзера на страничке, и если он похож на человека, то картинки не показываются

Сообщение было отредактировано: 11 ноя 19, 13:56
11 ноя 19, 13:55    [22013535]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
В общем, не так всё просто. Там куча событий используется и обрабатывается, в том числе и движение курсора мышки внутри фрейма.
11 ноя 19, 14:14    [22013566]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
alfangur
Member

Откуда:
Сообщений: 10
X11, посмотрите в сторону nwjs или electron либо другую реализацию в виде headless
так вы избавитесь от кучи костылей и получите актуальную версию браузера со всеми новыми фишками V8\JS и т.д.

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

P.S. если задач не много могу оказать помощь
11 ноя 19, 22:21    [22013969]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Я только-только более менее начал понимать, как работает Chromium api.
Плюс Chromium - это полноценный браузер с консолью и со встроенными средствами отладки полноценного браузера.
А ты предлагаешь изучать что-то новое. Мало того, ничего полезного я не нагуглил на тему: nwjs + delphi, а на тему Chromium + Delphi информация есть, пусть не так и много, но всё же есть.
11 ноя 19, 23:53    [22014019]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 911
X11
Я только-только более менее начал понимать, как работает Chromium api.
Плюс Chromium - это полноценный браузер с консолью и со встроенными средствами отладки полноценного браузера.
А ты предлагаешь изучать что-то новое. Мало того, ничего полезного я не нагуглил на тему: nwjs + delphi, а на тему Chromium + Delphi информация есть, пусть не так и много, но всё же есть.

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

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

Еше бы ))) вопрос был из серии "банкомат требует пин-кода карточки, на что нажать, чтобы его не вводить?"

Сообщение было отредактировано: 12 ноя 19, 11:39
12 ноя 19, 11:37    [22014257]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Василий 2, не понял, и что?

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

Мне что, самому нужно писать обёртку вокруг nwjs?
12 ноя 19, 11:41    [22014263]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
На сколько я понял, то Electron и nwjs - это для создания приложений, чтобы отображать веб-контент.
У меня задача немножко другая. Мну нужно парсить сайты.
12 ноя 19, 11:49    [22014282]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 911
Electron это движок браузера без обвязки, соответственно он позволяет писать приложения на html+js. Ну и отображать сайты, разумеется.
Но в общем случае CEF не имеет особых недостатков по сравнению с предложенным вариантом. Разве что вот каптчу обмануть... можно попробовать мышью над страницей "пошевелить". Но это опять же, с наскоку обмануть кодеров Гугла разве что гений сможет
12 ноя 19, 14:29    [22014513]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

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

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

Нет ли более менее простого способа, чтобы заменить Winapi.Messages на что-то другое?

К сообщению приложен файл. Размер - 30Kb
17 янв 20, 12:14    [22061479]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 911
В потоке вполне себе может быть окно, в чем проблема-то?
17 янв 20, 14:15    [22061595]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
вот в чем

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


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

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.
17 янв 20, 14:28    [22061616]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 911
Ну и не нужно. Создай в начале Thread.Execute окно через AllocateHWnd и твори в обработчике что надо из другого модуля. Или вообще создаешь окно, в конструкторе либо до запуска задавай объект-заглушку, а при получении сообщения вызывай TObject.Dispatch. Преимущество тут в том, что не надо писать WndProc метод, можно задать обработчики как TMsgHandler.Msg_That(var Message); message MSG_THAT
17 янв 20, 16:02    [22061700]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
ziv-2014
Member

Откуда:
Сообщений: 476
X11,
Что за код? Выложи?
17 янв 20, 16:53    [22061748]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
ziv-2014, код именно чего?
17 янв 20, 16:58    [22061754]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
В общем, я посмотрел пример использования компоненты TCEFUrlRequestClientComponent.
Добавил модуль TCEFUrlRequestClientComponent и в событии Chromium1.OnResourceResponse запускаю процедуру скачивания, типа:

  s := UTF8ToString(request.Url);

// вылавливаем нужный URL
  if s.ToLowerInvariant.Contains(fResponsePath.ToLowerInvariant) then
    DownloadRequestDataStart(s);
17 янв 20, 17:01    [22061757]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
ziv-2014
Member

Откуда:
Сообщений: 476
X11
ziv-2014, код именно чего?

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

Получения ответа response
17 янв 20, 17:02    [22061758]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Ещё один вариант мне предложили.
Где-то, в какой-то момент с пом. JS скачивать ещё раз тело ответа и внедрять его прямо в HTML, чтобы парсер видел прямо в теле страницы нужные данные.
17 янв 20, 17:11    [22061768]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
ziv-2014
X11
ziv-2014, код именно чего?

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

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


так это стандартный пример, см в папке
CEF4Delphi\demos\Delphi_VCL\ResponseFilterBrowser
17 янв 20, 17:12    [22061770]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Василий 2
Ну и не нужно. Создай в начале Thread.Execute окно через AllocateHWnd и твори в обработчике что надо из другого модуля.


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

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

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

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??? Я правильно понимаю?
22 янв 20, 13:10    [22064345]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Или где-то внутри Parser: TParseXXXXX нужно создавать ещё один "внутренний" поток и в нем запускать цикл ожидания, получения и обработки сообщений?
22 янв 20, 13:46    [22064367]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 911
Ну стало быть надо залезать внутрь DoParse. Я не очень понял, как у тебя хромиум может "работать через сообщения", если ты его засовываешь в цикл.
Обычная схема работы с выборкой сообщений в потоке - в Execute:

while not Terminated and GetMessage(Msg, 0, 0) do
case Msg.message of
  MSG_1: ...
  MSG_2: ...
end;


Как там устроен парсер - по названию функции сложно сказать, нужно больше деталей
22 янв 20, 18:09    [22064637]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
В DoParse организован тупо цикл whilte true по страницам сайта.


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


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

А у меня Хромиум скачивает странички примерно так:
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-содержимого живет в одном классе, в одном модуле.

Сообщение было отредактировано: 23 янв 20, 15:45
23 янв 20, 15:45    [22065322]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13675
Я думаю, что отправку сообщения самому себе можно заменить процедурой ожидания, где будет цикл while true, как в вышеописанном методе GetInnerHTMLPage
23 янв 20, 16:06    [22065344]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
Василий 2
Member

Откуда:
Сообщений: 911
Да, в примере PostMessage просто чтобы не блокировать форму, в случае потока можно заменить на вызовы соответствующих функций
23 янв 20, 16:43    [22065376]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4 5      [все]
Все форумы / Delphi Ответить