54 / 54 / 6
Регистрация: 20.05.2013
Сообщений: 265
1

Chromium. Получить переменную из Javascript в Делфи

04.07.2014, 23:23. Показов 10829. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Загружаю страницу сайта в Cromium, потом с помощью Javascript получаю нужную мне переменную.
Delphi
1
 Chrom.Browser.MainFrame.ExecuteJavaScript(memo1.Text, 'about:blank', 0);
Примерно так. JavaScript код, который будет выполняться, записан в memo1.Text

И как теперь мне передать/получить переменную из Javascript в делфи? ну в смысли чтобы использовать эту переменную в коде делфи
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.07.2014, 23:23
Ответы с готовыми решениями:

Нажать на кнопку Chromium Делфи
Мне надо нажать на кнопку в дроме "Показать телефон" и потом получить код страницы и извлечь номер...

Получить переменную javaScript
Имеется некая страница, в ее html коде есть фрагмент кода javaScript <script...

Получить переменную из JavaScript в PHP
На одной из страниц веб интерфейса принтера, есть кусок кода со скриптом <script...

Chromium для делфи
установил dcef3 с проектом нужно таскать сам движок браузера, который находится в папке bin ? или...

14
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
07.07.2014, 13:40 2
Никак.
0
4 / 4 / 1
Регистрация: 14.04.2013
Сообщений: 5
30.07.2014, 14:26 3
Лучший ответ Сообщение было отмечено Милт как решение

Решение

Почему ж никак? Есть один способ.

После того, как в JS вы получили нужное значение, отправляете его в консоль
Javascript
1
console.log('значение JS-переменной variable='+variable);
Получение всех сообщений в консоль можно отследить событием OnConsoleMessage объекта Chromium.
Delphi
1
2
3
4
5
6
procedure TForm1.Chromium1ConsoleMessage(Sender: TObject;
  const browser: ICefBrowser; const message, source: ustring; line: Integer;
  out Result: Boolean);
begin
showmessage(message);
end;
Правда иногда вылетают ещё сообщения с ошибками, поэтому при получении сообщения его было бы неплохо проверить: то ли это сообщение со значением переменной, которое отправила процедура console.log()

Способ, конечно, необычный, но ничего лучше я не придумал. Работает и хорошо
4
1 / 1 / 0
Регистрация: 04.07.2014
Сообщений: 47
30.07.2014, 15:55 4
Если получить доступ к DOM с переменными можно делать все, что угодно.
0
54 / 54 / 6
Регистрация: 20.05.2013
Сообщений: 265
02.08.2014, 03:44  [ТС] 5
snowextreeme, спасибо, получилось. Нужно было ещё модуль CefLib подключить.

Может есть ещё способ чтобы получить переменную из JS для TWebBrowser ?
0
4 / 4 / 1
Регистрация: 14.04.2013
Сообщений: 5
02.08.2014, 13:09 6
Т.е. WebBrowser должен достать значения переменных при выполеннии JS кода сайта, правильно понимаю?
Если да, то второй вопрос: есть ли возможность изменить этот JS код?
P.S. Для "спасибо" есть специальная кнопка
0
Модератор
9892 / 5256 / 3312
Регистрация: 17.08.2012
Сообщений: 16,048
02.08.2014, 14:13 7
Цитата Сообщение от snowextreeme Посмотреть сообщение
P.S. Для "спасибо" есть специальная кнопка
snowextreeme, правило форума:
5. 10. Запрещено накручивать репутацию и другую статистику пользователя любым способом, включая создание пользователей-клонов, а также склонять (агитировать) других пользователей к ее изменению.
1
54 / 54 / 6
Регистрация: 20.05.2013
Сообщений: 265
02.08.2014, 17:52  [ТС] 8
snowextreeme, я не могу тебе поставить +1 может быть потому что у тебя мало сообщений на форуме.
Нет же, я ж написал что код в мемо1 записан. Но если есть желание то можно и код страницы подменить в браузере делфи, но не на сервере конечно.
0
4 / 4 / 1
Регистрация: 14.04.2013
Сообщений: 5
02.08.2014, 22:29 9
JS может выводить инфу только 3 способами:
1. В HTML-элемент (value, innerHTML)
2. В отладочную браузерную консоль
3. В сам документ посредством document.write()

1 - не вариант. Можно конечно, но для каждой страницы всё расписывать...
2 - Вывести-то можно, вот только я не нашел ничего, что помогло бы WB прочитать оттуда
3 - более-менее работающий вариант. Только в этом случае стоит учесть, что использование document.write() перепишет загруженную до этого страницу. Потом с новой полученной страницы спарсить значения
0
2 / 2 / 0
Регистрация: 01.08.2014
Сообщений: 14
03.08.2014, 11:45 10
Существует еще 4й вариант: - это работа с файлами по средствам JS

Нужные переменные после выполнения JS скрипта, с помощью JS так же сохраняете в файл, а из под Delphi его читаете

http://webmaster.ee/javascript... /file.html
0
0 / 0 / 0
Регистрация: 27.03.2017
Сообщений: 4
14.11.2017, 16:45 11
Может кому нибудь будет актуально, я пользуюсь алертами с javascript и отлавливаю их chromiumJsdialog(...


Использую chromium как интерфейс программы.. постоянная взаимосвязь, на каждую страницу у меня свой класс, ну и собственно на кнопках страниц при клике у меня стоит выполнение процедуры


Javascript
1
2
3
function doit(m_class,m_method,m_params,sub_params,sub_sub_params){
   alert('{class:"'+m_class+'",method:"'+m_method+'",params:" '+m_params+'",params2:"'+sub_params+'",params3:"'+sub_sub_params+'"}');    
}
doit("main_table","add_record"); - создать запись в таблице
doit("catalog","create_folder","название каталога") - думаю понят что создать папку с таким именем

функция возвращает json
где m_class - класс к которому надо обратиться
m_method - функция\процедура в делфе
m_params... - передаваемые параметры в функцию\процедуру

и разбирая данные отправляю их в нужную функцию в нужную процедуру
соответственно по примерам выше, у меня в делфи есть класс Tcatalog и в котором есть функция create_folder .. в ней делаю необходимые действия и обратно скриптом в добавляю уже созданную в БД или на диске папку в список.. и т.д.

Можно еще зарегистрировать в делфе функцию
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  TTestExtension = class
    class function hello: string;
 
  end;
 
    TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
  protected
    procedure OnWebKitInitialized; override;
  end;
-----------------
procedure TCustomRenderProcessHandler.OnWebKitInitialized;
begin
 
  TCefRTTIExtension.Register('app', TTestExtension);
 
end;
 
class function TTestExtension.hello: string;
begin
  Result := 'Hello from Delphi';
end;
...............
initialization
 CefRenderProcessHandler := TCustomRenderProcessHandler.Create;
в скрипте можно писать:
Javascript
1
app.hello()
вернется из функции делфи : Hello from Delphi

Если будут вопросы пишите в скайп (Контакт удалён)
0
Cyborg Drone
14.11.2017, 17:37
  #12

Не по теме:

evgen2411,
не следует в тематических разделах этого форума публиковать свои контакты. Публиковать свои контакты можно только в коммерческих разделах форума, если Вы выступаете как исполнитель.
Обсуждение вопросов темы - только в теме. Приглашения к обсуждению еще где-либо (в том числе и с помощью системы личных сообщений) запрещены, за исключением коммерческих разделов.

Правила форума
Права пользователей форума

0
5297 / 4329 / 1063
Регистрация: 29.08.2013
Сообщений: 27,158
Записей в блоге: 3
14.11.2017, 23:55 13
можно еще в console писать и в Chromiuim отлавливать - там есть событие
я так делал когда с яндекс.картами пытался работать - выводил их json в лог и ловил уже в Delphi
0
0 / 0 / 0
Регистрация: 27.03.2017
Сообщений: 4
15.11.2017, 09:44 14
ну минус консоли в том, что в нее сыпется весь хлам..включая ошибки и т.д., а это лишние проверки, а бывает что где-то косяк, и огромное количество ошибок в консоль сыпется в отличие от использования алертов
0
54 / 54 / 6
Регистрация: 20.05.2013
Сообщений: 265
20.12.2017, 19:55  [ТС] 15
Ну это не проблема. Нужную переменную можно передавать вместе со строкой-идентификатором. Если строка присутствует, значит это моя переменная. Минус всех этих способов заключается в том что код делфи не ждёт когда яваскрипт вернёт значение и приходится убогим способом, с помощью таймера, отслеживать получение переменной, чтобы потом продолжить выполнение кода делфи.
0
20.12.2017, 19:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2017, 19:55
Помогаю со студенческими работами здесь

Возможно ли загрузить в компонент Chromium текстовую переменную
Привет всем. Установил новый компонент Chromium, чтобы загружать страницы разобрался ...

Chromium получить хендл открытого окна
Приветствую, ребята! Столкнулся с такой незадачей. Использую движок Chromium. При клике по ссылке -...

Delphi Chromium получить текст страницы
Как получить внутренний текст страницы? В браузере это вот так Memo1.Lines.Text :=...

Не могу получить скриншот с компонента Chromium
Здравствуйте, установил компонент Chromium, все прекрасно работает, но не могу получить скрин,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru