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 (55)
- 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)
- Aralık 2024 (1)
- Ocak 2025 (1)
- Temmuz 2025 (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