Delphi 7'de Webbrowser Kullanımı

Günümüzde birçok işlem web sayfaları üzerinde yapılmakta. Ancak kullanıcılara şifre atama gibi durumlarda aynı işlemi web sitesi üzerinde defalarca yapmak gerekebiliyor. Delphi ile web sayfalarında yapılan işlemleri Webbrowser bileşeni ile otomatize edebililiyoruz.

Delphi 7'deki web browser bileşeni aslında işletim sistemindeki Internet Explorer sürümüne ait bir ActiveX bileşeni. Bu bileşen Delphi 7'de Internet sekmesinde yer alıyor. Webbrowser bileşeni Internet Explorer gibi çalışıyor. Dolayısıyla eski bir Internet Explorer sürümüne sahipseniz, güncel sitelerde scriptlere ait hata mesajları almanız olası. Bu durumda Delphi tarafında işlemin yarıda kalmaması için şu kodu kullanıyoruz:

WebBrowser1.Silent:=true;

Bileşine girilen web adresini açmak için kullandığımız yapı şu şekilde:

WebBrowser1.Navigate(edtUrl.Text);
while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do begin
  Sleep(1);
  Application.ProcessMessages;
end;

Burada gidilecek web sayfasının adresinin belirtilmesi için Navigate metodu kullanılıyor. Web sayfasının tamamının yüklenmesini beklemek için de, while döngüsü kullanılıyor.

İşlemleri otomatize ederken büyük ihtimalle web sayfasına kullanıcı girişi yapmamız gerekecek. Dolayısıyla web sayfasındaki input bölümlerini otomatik doldurabilmemiz gerekli. Bunu yapabilmek için aşağıdaki yapıyı kullanıyoruz:

WebBrowser1.OleObject.Document.GetElementByID('username').Value := 'admin';
WebBrowser1.OleObject.Document.GetElementByID('password').Value := '123456';

Yukarıdaki örnekte, kullanıcı adı ve parola girilecek input'ların id'lerini web sayfasının kaynak koduna bakarak username ve password olarak tespit ediyoruz.

Bu noktadan sonra işler biraz karışıyor. Çünkü web sayfaları formu göndermek için kullandıkları submit butonunu farklı çeşitlerde oluşturabiliyorlar. İlk önce aşağıdaki yapıyı inceleyelim:

<input value="GÖNDER" type="submit">

Bu yapıda görüldüğü üzere düğmeye ait bir id yok. Elimizde sadece value değerinde GÖNDER var. İşte bu tip düğmelere Delphi tarafından tıklama sağlanması için aşağıdaki alt programı kullanıyoruz: 

procedure WB_send_Click_by_Value(WB: TWebbrowser;form_nr:nativeint;tag,typ,val: string);
var ovElements: OleVariant;
i: Integer;
begin
  ovElements := WB.OleObject.Document.forms.item(form_nr).elements;
  for i := 0 to (ovElements.Length - 1) do
    begin
      if AnsiSameText(ovElements.item(i).tagName,tag) and
         AnsiSameText(ovElements.item(i).type,typ) and
         AnsiSameText(ovElements.item(i).value,val) then
         ovElements.item(i).Click;
    end;
end;

Yukarıdaki örnekteki GÖNDER düğmesine tıklamak için bu alt programı şu şekilde çağırıyoruz:

WB_send_Click_by_Value(WebBrowser1,0,'input','submit','GÖNDER');

Submit düğmesinin bir çeşidi de şu şekilde kodlanabliyor: 

 <button type="submit">Gönder</button>

Bu yapıda düğmeye tıklamak için aşağıdaki kodları kullanıyoruz.

var
  Elem: IHTMLElement;
  Buttons: OleVariant;
  Button: OleVariant;
  I: Integer;
begin
  Buttons := WebBrowser1.OleObject.Document.getElementsByTagName('button');
  for I := 0 to Buttons.Length - 1 do
  begin
    Button := Buttons.item(I);
    if Button.innerText = 'Gönder' then
    begin
      Button.click();
      Break;
    end;
  end;

Bundan sonra işimiz, sayfadan istediğimiz bilgileri Delphi programına çekmek. Burada Ajax'la dönen değerleri almakta sorun yaşıyoruz. Bu sorundan kurtulmak için alt program şu şekilde:

function GetElementById(const Doc: IDispatch; const Id: string): IDispatch;
var
  Document: IHTMLDocument2;     // IHTMLDocument2 interface of Doc
  Body: IHTMLElement2;          // document body element
  Tags: IHTMLElementCollection; // all tags in document body
  Tag: IHTMLElement;            // a tag in document body
  I: Integer;                   // loops thru tags in document body
begin
  Result := nil;
  // Check for valid document: require IHTMLDocument2 interface to it
  if not Supports(Doc, IHTMLDocument2, Document) then
    raise Exception.Create('Invalid HTML document');
  // Check for valid body element: require IHTMLElement2 interface to it
  if not Supports(Document.body, IHTMLElement2, Body) then
    raise Exception.Create('Can''t find <body> element');
  // Get all tags in body element ('*' => any tag name)
  Tags := Body.getElementsByTagName('*');
  // Scan through all tags in body
  for I := 0 to Pred(Tags.length) do
  begin
    // Get reference to a tag
    Tag := Tags.item(I, EmptyParam) as IHTMLElement;
    // Check tag's id and return it if id matches
    if AnsiSameText(Tag.id, Id) then
    begin
      Result := Tag;
      Break;
    end;
  end;
end;

Yukarıdaki alt program yardımıyla Ajax'la dönen  değeri ShowMessage ile şu şekilde ekrana yansıtabiliyoruz:

procedure TForm1.Button1Click(Sender: TObject);
var
  Elem: IHTMLElement;
begin
  Elem := GetElementById(WebBrowser1.Document, 'Ajaxla-Donen-Id') as IHTMLElement;
  if Assigned(Elem) then
    ShowMessage(
      'Tag name = <' + Elem.tagName + '>'#10 +
      'Tag id = ' + Elem.id + #10 +
      'Tag innerHTML = "' + Elem.innerHTML + '"'
    );
end;

11.01.2016 11:01:34


Etiketler: pascal, delphi fonksiyonları

Yorumlar

Merhaba paylaşımınız çok başarılı bende delphide ufak tefek birşeyler yapmaya çalışıyorum. forma eklemiş olduğum webbrowserdeki tagları yazdığınız kodlarla alabiliyorum fakat benim yapmak istediğim güvenlik resmini okuyup yazı yada numaraya çevirmesini sağlamak fakat bir kaç kişiye danıştım mümkün olmadığını söylediler bende bu sefer o görseli image olarak formun içinde gösterebilirmiyim diye uğraşıyorum fakat bir türlü image'de gösteremedim. Bu konuda örnek alabileceğim bir kaynak önerirmisiniz?

Developer, 16.01.2019 13:59:38


Yazı hakkında yorum yapmak için, buraya tıklayın.

Kategoriler :

Arşiv :

Etiketler :

Bağlantılar :