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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

Т.к. то ,что есть здесь 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
Сообщений: 13226
X11
Как задать папку хранения, например?


GlobalCEFApp.Cache := 

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

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

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

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

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

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

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


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

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

Откуда: Kharkiv, Ukraine
Сообщений: 13226
Есть примеры процедур 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

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

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

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

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

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

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

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

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

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

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

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

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

Откуда: Kharkiv, Ukraine
Сообщений: 13226
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
Сообщений: 13226
Так это ж недельфи код
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
Сообщений: 13226
я не понимаю, что такое скармливай. как, куда?
где, в какой момент?

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

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


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

Откуда: Киров, Россия
Сообщений: 999
Это бессмысленная задача причем даже в ближайшей перспективе :)
Сейчас телефон в текстовом виде, а когда запалитесь он станет в виде картинки, начнете распознавать картинку и он станет с вотермарками и прочими прелестями.
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
Сообщений: 13226
Отлично. Спасибо.

А как узнать, что страница полностью загружена?
Использую 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
Сообщений: 13226
в 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
Сообщений: 6510
X11,

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

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

Откуда: Kharkiv, Ukraine
Сообщений: 13226
Подскажите, а у браузера есть возможность получить 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

Откуда: РФ
Сообщений: 687
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

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

Откуда: Kharkiv, Ukraine
Сообщений: 13226
Ещё вопрос по примеру 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
Сообщений: 13226
при этом
browser.FrameCount

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

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

Откуда: Kharkiv, Ukraine
Сообщений: 13226
Итак... чтобы кликнуть на ссылку и потом получить текст страницы нужно примерно такие действия.
Делал на примере 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
Сообщений: 13226
VisitDom работает только в процессе, который занимается рендерингом
frame.VisitDom(TempVisitor);


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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

Откуда: Kharkiv, Ukraine
Сообщений: 13226
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

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


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

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

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


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

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

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


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

Откуда: Kharkiv, Ukraine
Сообщений: 13226
Подскажите, а что нужно указывать в качестве 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

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

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

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

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

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

Откуда: Kharkiv, Ukraine
Сообщений: 13226
ок, тогда с помощью чего найти телефон или признак телефона во время итерации по 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

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

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

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


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

Откуда: Kharkiv, Ukraine
Сообщений: 13226
Если на примере цикла итерации по 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
Сообщений: 13226
Я ещё не могу понять/найти: в каком свойстве, где живёт то, что на картинке подчеркнуто в программе в 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
Сообщений: 13226
я забыл про рекурсию
29 авг 19, 15:59    [21959966]     Ответить | Цитировать Сообщить модератору
 Re: CEF4Delphi в потоке с внешней формой  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13226
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
Сообщений: 13226
X11
procedure SimpleDOMIteration(


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

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

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

+ найти нужный атрибут и значение узла в цикле по 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

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

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

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


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

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


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

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


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

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

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

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

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

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

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

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

Откуда: Kharkiv, Ukraine
Сообщений: 13226
ведь процесс создания браузера запускается из 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

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

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


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

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

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


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

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

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

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


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

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


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

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


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

Откуда: Kharkiv, Ukraine
Сообщений: 13226
Возникла проблема в реальной программе.
Программа защищается с помощью 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
Сообщений: 13226
В принципе, у меня всё взлетело и парсинг работает в отдельном потоке без окон, т.е. в режиме headless.

Осталось решить проблему с загрузкой сторонней dll.
11 сен 19, 16:17    [21968652]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4      [все]
Все форумы / Delphi Ответить