Поиск по блогу

четверг, 21 февраля 2013 г.

TChromium: заполнение и сабмит формы

Опишу самый простой способ заполнения и отправки формы с использованием компонента TChromium. С доступом к DOM-элементам по id в нем дела обстоят не так хорошо, как в Webbrowser-е, но зато очень просто исполнять любые java-скрипты.

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.

Статьи схожей тематики:



13 комментариев:

  1. Здравствуйте! Очень интересно! Интересует один вопрос: можно-ли с помощью TChromium ставить программно лайки?

    ОтветитьУдалить
  2. Мария, здравствуйте.

    Я пробовал сам писать парсер для выкачки базы товаров из интернет-магазина.
    Столкнулся с тем что, хостер сайта забанил мой IP за большой поток запросов. Пришлось поставить задержку + пользоваться сторонними прокси (которых хостер также периодически банил).

    Подскажите пожалуйста, из своего опыта - какова обычно рекомендуемая задержка для парсеров?

    ОтветитьУдалить
    Ответы
    1. Тут рекомендаций особых дать не могу. Сама тоже использую задержку + список прокси. Если некуда спешить, для одного IP ставлю задержку рандомно из диапазона от 2 до 4 секунд. Все зависит, конечно, от администратора ресурса ;)

      Удалить
    2. прокси юзать не вариант?

      Удалить
    3. waketwo, читайте внимательно, там и так написано про прокси. Задержка используется как дополнительная подстраховка от возможного бана.

      Удалить
  3. Мария, подскажите пожалуйста, как получить результат выполнения функций java script в код delphi? Например заголовок страницы.

    ОтветитьУдалить
  4. Привет, Как получить текст со страницы Chromium1?

    var str:string;
    begin
    str:=Chromium1.Browser.GetBody;
    end;

    Не работает, потому что нету GetBody в Browser))) как сделать такое?

    ОтветитьУдалить
  5. Есть такой код
    span class="b-like__link" data-type="like" data-target="click" data-clns=""

    Подскажите пожалуйста как кликнуть по такому элементу без id?
    Ps На странице это не первый тэг span
    Спасибо)

    ОтветитьУдалить
  6. Приветствую. Люди добрые, если кто разобрался с этим компонентом, помогите советом. JavaScript это очень хорошо, но есть загвоздочка. Мне нужно как-то определить получилось ли скрипту выполнить ту или иную команду и среагировать на это программно. Я к тому, что могу ли я как-то определить выполнился ли корректно скрипт. Например вот вы пишите:
    CodeStr := 'document.forms[0].quick_email.value="UserEmail";'
    А можно ли как-то определить, получилось ли записать это value. Вдруг на форме в момент выполнения скрипта не было quick_email.

    ОтветитьУдалить
  7. Добрый день, Маша. Подскажите, не доводилось ли Вам нажимать на кнопки с помощью этого компонента. Код типа:
    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?

    ОтветитьУдалить
    Ответы
    1. Да, я бы посмотрела в сторону JavaScript...

      Удалить
  8. Здравствуйте. Этой статьей вы очень помогли. спасибо! Эти коды, которые вы использовали, где можно прочитать об этом подробнее? Заранее спасибо!

    ОтветитьУдалить

Комментарии модерируются, вопросы не по теме удаляются, троллинг тоже.

К сожалению, у меня нет столько свободного времени, чтобы отвечать на все частные вопросы, так что, может, свой вопрос лучше задать на каком-нибудь форуме?

Поделиться