Btgunluk.com
Kişisel bir bilişim blogu
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
Developer, 16.01.2019 13:59:38
Yazı hakkında yorum yapmak için, buraya tıklayın.
Kategoriler :
- Bilişim (52)
- C Sharp (1)
- Delphi (44)
- Duyuru (8)
- Excel (8)
- Fıkralar (9)
- Flash (2)
- Javascript (3)
- Kategorisiz (2)
- Kıssa'dan Hisse (5)
- Php (20)
- Program Tanıtımı (1)
- Python (2)
Arşiv :
- Kasım 2008 (11)
- Ekim 2010 (6)
- Kasım 2010 (11)
- Aralık 2010 (3)
- Ocak 2011 (2)
- Mayıs 2011 (1)
- Temmuz 2011 (4)
- Ağustos 2011 (10)
- Ekim 2011 (2)
- Ocak 2012 (2)
- Şubat 2012 (1)
- Mart 2012 (1)
- Nisan 2012 (3)
- Haziran 2012 (2)
- Temmuz 2012 (1)
- Ağustos 2012 (1)
- Kasım 2012 (1)
- Mart 2013 (1)
- Mayıs 2013 (1)
- Temmuz 2013 (1)
- Ekim 2013 (2)
- Kasım 2013 (2)
- Şubat 2014 (1)
- Ekim 2014 (1)
- Kasım 2014 (3)
- Şubat 2015 (1)
- Ağustos 2015 (3)
- Eylül 2015 (1)
- Ekim 2015 (1)
- Ocak 2016 (3)
- Nisan 2016 (1)
- Ekim 2016 (1)
- Aralık 2016 (8)
- Ocak 2017 (27)
- Şubat 2017 (1)
- Haziran 2017 (1)
- Eylül 2017 (1)
- Kasım 2017 (1)
- Ocak 2018 (2)
- Temmuz 2018 (2)
- Kasım 2018 (1)
- Aralık 2018 (1)
- Şubat 2019 (1)
- Ağustos 2019 (2)
- Aralık 2019 (1)
- Ocak 2020 (1)
- Nisan 2020 (10)
- Kasım 2020 (1)
- Aralık 2020 (1)
- Ocak 2021 (1)
- Mayıs 2022 (1)
- Kasım 2022 (1)
- Mart 2023 (1)
- Mayıs 2023 (2)
- Haziran 2023 (1)
- Ocak 2024 (2)
- Temmuz 2024 (1)
Etiketler :
- 3d acar baltas Android asp.net banana pi c sharp delphi fonksiyonları excel Firefox flash flowplayer ipucu opencv pascal pdf php fonksiyonları python super pi ttnet veritabanı video visual studio Windows word