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

четверг, 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.

суббота, 9 февраля 2013 г.

Как удалить кукисы (cookies) в TChromium

В комментариях к статье о начале работы с TChromium спросили, как удалить в нем кукисы? Скажу сразу, решение не мое, нашла в свое время на СтэкОверфлоу, скопировала и с тех пор удачно использую.

Сначала надо отметить, что у интерфейса ICefCookieManager есть метод DeleteCookies, но он почему-то не работает. То есть в результате выполнения кода:

procedure TfrmMain.btnDeleteCookiesClick(Sender: TObject);
var
  CookieManager: ICefCookieManager;
begin
  CookieManager := TCefCookieManagerRef.GetGlobalManager;
  if not CookieManager.DeleteCookies('', '') then
    ShowMessage('Кукисы не удалены!');
end;

заведомо появится сообщение, что удаление кукисов провалилось. Не знаю, может, это только у меня так...

Решение же таково: надо обойти все хранящиеся кукисы с помощью VisitAllCookiesProc и внутри visitor-а установить их свойство deleteCookie равным True (1).

procedure TfrmMain.btnDeleteCookiesClick(Sender: TObject);
var
  CookieManager: ICefCookieManager;
begin
  CookieManager := TCefCookieManagerRef.GetGlobalManager;
  CookieManager.VisitAllCookiesProc(
    function(const name, value, domain, path: ustring; secure, httponly,
      hasExpires: Boolean; const creation, lastAccess, expires: TDateTime;
      count, total: Integer; out deleteCookie: Boolean): Boolean
    begin
      deleteCookie := True;
      ShowMessage('Кукисы для домена ' + domain + ' удалены!');
    end
  );
end;


Поделиться