Опишу самый простой способ заполнения и отправки формы с использованием компонента TChromium. С доступом к DOM-элементам по id в нем дела обстоят не так хорошо, как в Webbrowser-е, но зато очень просто исполнять любые java-скрипты.
JavaScript может пригодится не только для заполнения форм, он вообще достаточно широко используется.
Исполнение скрипта осуществляется с помощью ExecuteJavaScript. При этом обязательно проверять, чтобы Chromium.Browser и Chromium.Browser.Mainframe были отличны от nil.
Вот как будет выглядеть заполнение и сабмит формы логина на сайте vk.com.
На практике столкнулась с необъяснимой ситуацией: если этот код попробовать запустить в Delphi 7, то Chromium.Browser.Mainframe почему-то будет равен nil (а если проверку убрать, то вываливается ошибка доступа). На каком-то форуме нашла, что это общая проблема для Семерки. В 2010 все работает отлично.
Чтобы быть в курсе обновлений блога, можно подписаться на RSS.
JavaScript может пригодится не только для заполнения форм, он вообще достаточно широко используется.
Исполнение скрипта осуществляется с помощью ExecuteJavaScript. При этом обязательно проверять, чтобы Chromium.Browser и Chromium.Browser.Mainframe были отличны от nil.
Вот как будет выглядеть заполнение и сабмит формы логина на сайте vk.com.
procedure TfrmMain.btnLoginClick(Sender: TObject); var CodeStr : string; begin if Assigned(Chromium.Browser) and Assigned(Chromium.Browser.Mainframe) then begin CodeStr := 'document.forms[0].quick_email.value="UserEmail";'; Chromium.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0); CodeStr := 'document.forms[0].quick_pass.value="UserPass";'; Chromium.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0); CodeStr := 'document.forms[0].submit();'; Chromium.Browser.MainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0); end; end;
На практике столкнулась с необъяснимой ситуацией: если этот код попробовать запустить в Delphi 7, то Chromium.Browser.Mainframe почему-то будет равен nil (а если проверку убрать, то вываливается ошибка доступа). На каком-то форуме нашла, что это общая проблема для Семерки. В 2010 все работает отлично.
Чтобы быть в курсе обновлений блога, можно подписаться на RSS.
Здравствуйте! Очень интересно! Интересует один вопрос: можно-ли с помощью TChromium ставить программно лайки?
ОтветитьУдалитьА почему собственно нельзя?
ОтветитьУдалитьМария, здравствуйте.
ОтветитьУдалитьЯ пробовал сам писать парсер для выкачки базы товаров из интернет-магазина.
Столкнулся с тем что, хостер сайта забанил мой IP за большой поток запросов. Пришлось поставить задержку + пользоваться сторонними прокси (которых хостер также периодически банил).
Подскажите пожалуйста, из своего опыта - какова обычно рекомендуемая задержка для парсеров?
Тут рекомендаций особых дать не могу. Сама тоже использую задержку + список прокси. Если некуда спешить, для одного IP ставлю задержку рандомно из диапазона от 2 до 4 секунд. Все зависит, конечно, от администратора ресурса ;)
Удалитьпрокси юзать не вариант?
Удалитьwaketwo, читайте внимательно, там и так написано про прокси. Задержка используется как дополнительная подстраховка от возможного бана.
УдалитьМария, подскажите пожалуйста, как получить результат выполнения функций java script в код delphi? Например заголовок страницы.
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьЕсть такой код
ОтветитьУдалитьspan class="b-like__link" data-type="like" data-target="click" data-clns=""
Подскажите пожалуйста как кликнуть по такому элементу без id?
Ps На странице это не первый тэг span
Спасибо)
Приветствую. Люди добрые, если кто разобрался с этим компонентом, помогите советом. JavaScript это очень хорошо, но есть загвоздочка. Мне нужно как-то определить получилось ли скрипту выполнить ту или иную команду и среагировать на это программно. Я к тому, что могу ли я как-то определить выполнился ли корректно скрипт. Например вот вы пишите:
ОтветитьУдалитьCodeStr := 'document.forms[0].quick_email.value="UserEmail";'
А можно ли как-то определить, получилось ли записать это value. Вдруг на форме в момент выполнения скрипта не было quick_email.
Добрый день, Маша. Подскажите, не доводилось ли Вам нажимать на кнопки с помощью этого компонента. Код типа:
ОтветитьУдалитьCodeStr := 'document.forms[0].quick_login_button.click;';
wb1.Browser.GetMainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0);
в delphi 7 не работает, хотя скрипты по заполнению value эдитов работает.
Кстати в седьмом делфи не работает и предложенный Вами код:
CodeStr := 'document.forms[0].submit();';
wb1.Browser.GetMainFrame.ExecuteJavaScript(CodeStr, 'about:blank', 0);
Предупреждаю Ваше замечание насчет известной проблемы с mainFrame в delphi 7, как видите, в моем коде используется конструкция getMainFrame, которая успешно отрабатывает с заполнением текстовых полей.
Правильно ли я понимаю, что искать лучше всего на форуме по javaScript?
Да, я бы посмотрела в сторону JavaScript...
УдалитьЗдравствуйте. Этой статьей вы очень помогли. спасибо! Эти коды, которые вы использовали, где можно прочитать об этом подробнее? Заранее спасибо!
ОтветитьУдалить