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

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

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

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


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

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


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

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

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

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



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

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

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

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

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



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

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

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

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

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


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

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

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



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



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



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

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

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

JS
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
var intervalHandl;
var tel = "";
var tel1 = "";
var s1 = "Показать номер";
var countTryFindTel = 0;
const cTryFindTel = 4;// 5 попыток для поиска телефона
const constQuerySelectorAll1 = "span.sc-cJSrbW.cHCRbi";
const constQuerySelectorAll2 = "???";

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

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

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

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


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

т.е. приходится клеить document.Head.AsMarkup + document.Body.AsMarkup
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39881522
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, сохранил страничку в текст. А она в кодировке ANSI. Так и должно быть?
Снимок с виндового Блокнота:
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887254
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кто-нибудь пробовал нажать программно на гугловскую рекапчу? Обойти её...
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887328
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подозреваю, если бы это было так просто, то в ней не было бы никакого смысла))
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887338
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не про распознавание картинки.
Иногда рекапча не показывает картинок, нужно просто кликнуть.
...
Рейтинг: 0 / 0
CEF4Delphi в потоке с внешней формой
    #39887463
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так а в чем проблема-то? Находишь ДОМ элемент, кликаешь.
Только опять же, она не просто так не показывает картинки. Иначе это была бы не каптча. Насколько я знаю, она анализирует действия юзера на страничке, и если он похож на человека, то картинки не показываются
...
Рейтинг: 0 / 0
25 сообщений из 139, страница 4 из 6
Форумы / Delphi [игнор отключен] [закрыт для гостей] / CEF4Delphi в потоке с внешней формой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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