Delphi Kodlama – Delphide Webbrowser Kullanımı

Günümüzde birçok işlem web sayfaları üzerinde yapılmaktadır ve delphi kodlama ile web sayfalarını kontrol edebilirsiniz. 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:
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.
WebBrowser1.Navigate(edtUrl.Text);
while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do begin
Sleep(1);
Application.ProcessMessages;
end;

İş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 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;

 

 

 

(2) Yorum

  1. Yusuf AYDIN

    diyor Ara 12, 2017 at 18:32

    Webbrowser kullanımı ile bu kadar açık, yalın ve anlaşılır bir makaleyi bizimle paylaştığınız için çok teşekkür ederim. Muhtemel olasılıkları göze alarak farklı açılardan da detaylara yer verilmiş olması, konunun daha iyi aydınlatılmasını sağlamış. Yeni makalelerinizi sabırsızlıkla bekliyoruz. İşlerinizde başarılar dilerim.

    • Safir Medya

      diyor Ara 16, 2017 at 23:38

      Güzel yorumunuz için teşekkür ederiz. Yeni makalemiz birkaç gün içinde yayınlanacak.

Yorumunu Yaz

WhatsApp Destek
Mesajı Gönder
Safir Medya