Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi ile Web Form Alanlarını Doldurma
#1
           

Arkadaşlar merhaba çalıştığım işyerinde ticaret bakanlığından aldığımız belge var bu belgeyi alabilmek için bazı alanları doldurmamız gerekiyor buda çok zaman alıyor o yüzden Delphiyi kullanarak aşağıdaki kodlarla formdaki ilgili alanları doldurabiliyorum ancak şöyle bir sorun ortaya çıkıyor görsellerde de görüldüğü üzere ben alanları doldurup giriş butonuna tıklattığımda web sayfası ilgili alanları doldurulmamış kabul ediyor sizce bu neden oluyor yazmam gereken bir kod mu var çözemedim? Yardımlarınızı bekliyorum.

Kullanmış olduğum kodlar.

procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('https://ithalat.ebirlik.org/impws/app');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
WebBrowser1.OleObject.Document.GetElementByID('c_19').value :=edit1.Text;
WebBrowser1.OleObject.Document.GetElementByID('c_23').value:=edit2.Text;
WebBrowser1.OleObject.Document.GetElementByID('c_27_item_1').value:='Türkçe'
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
WebBrowser1.OleObject.Document.GetElementByID('c_29').Click;
end;
Cevapla
#2
Linke baktım "focus" kontrolü yapılmış. aşağıdaki şekilde veri girişlerini focus ile zenginleştirip dener misiniz...?

 WebBrowser1.OleObject.Document.GetElementByID('c_19').focus;
 WebBrowser1.OleObject.Document.GetElementByID('c_19').value :=edit1.Text;

 WebBrowser1.OleObject.Document.GetElementByID('c_23').focus;
 WebBrowser1.OleObject.Document.GetElementByID('c_23').value :=edit2.Text;
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
(05-09-2024, Saat: 11:37)mrmarman Adlı Kullanıcıdan Alıntı: Linke baktım "focus" kontrolü yapılmış. aşağıdaki şekilde veri girişlerini focus ile zenginleştirip dener misiniz...?

 WebBrowser1.OleObject.Document.GetElementByID('c_19').focus;
 WebBrowser1.OleObject.Document.GetElementByID('c_19').value :=edit1.Text;

 WebBrowser1.OleObject.Document.GetElementByID('c_23').focus;
 WebBrowser1.OleObject.Document.GetElementByID('c_23').value :=edit2.Text;

Sayın Muharrem Arman hocam teşekkür ederim yardımınız için kod sorunsuz çalıştı.
Cevapla
#4
Arkadaşlar merhaba konu ile alakalı yeni bir problemim var o yüzden tekrardan bu başlık altında soruyu sormak istedim.Ekte paylaşmış olduğum videoda yapmış olduğum projenin tamamlanmış hali var projeye göre işlem 10 numara çalışıyor ancak bazan internet hızına göre sayfaların açılması yavaşlıyor delphi tarafındanda kodlar hızlı işlediği için internet sayfasının hızını beklemeden kodlar işliyor dolayısıyla nesne bulunamadı hatası veriyor ben bunun önüne nasıl geçebilirim. her kod işlerken sayfanın yüklenmesini bekleyecek. Ben bu işlemleri timer ile yapıyorum hem kodları sırasıyla işletecek hemde internet sayfası yüklenmesini bekleyecek şekilde tavsiye edeceğiniz bir yöntem varsa çok memnun olurum.

Video Link:

https://icecreamapps.com/v/cmzxhs5

Kullanmış olduğum kodların enson hali şu şekilde bu kodlar şu an taslak halindedir daha sonra düzenleme yapacağım. 
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.OleObject.Document.GetElementByID('c_19').FOCUS;
WebBrowser1.OleObject.Document.GetElementByID('c_19').value :=edit1.Text;

WebBrowser1.OleObject.Document.GetElementByID('c_23').FOCUS;
WebBrowser1.OleObject.Document.GetElementByID('c_23').value:=edit2.Text;
WebBrowser1.OleObject.Document.GetElementByID('c_27_item_1').value:='Türkçe'

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
WebBrowser1.OleObject.Document.GetElementByID('c_29').Click;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
WebBrowser1.OleObject.Document.GetElementByID('c_71_td_0').Click;

end;

procedure TForm1.Button4Click(Sender: TObject);
begin
WebBrowser1.OleObject.Document.GetElementByID('c_104_td_0').Click;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
timer1.Enabled:=true;
//WebBrowser1.OleObject.Document.GetElementByID('c_351').FOCUS;

end;

procedure TForm1.Button7Click(Sender: TObject);
begin
WebBrowser1.OleObject.Document.GetElementByID('c_351').FOCUS;
WebBrowser1.OleObject.Document.GetElementByID('c_351').value :=edit3.Text;

WebBrowser1.OleObject.Document.GetElementByID('c_361').FOCUS;
WebBrowser1.OleObject.Document.GetElementByID('c_361').value:=edit4.Text;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
WebBrowser1.OleObject.Document.GetElementByID('c_397_td_0').Click;
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
WebBrowser1.OleObject.Document.GetElementByID('c_129_td_0').Click;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
webbrowser1.Navigate('ithalat.ebirlik.org/impws/app');
end;



procedure TForm1.Timer1Timer(Sender: TObject);
begin
button1.Click;
timer2.Enabled:=true;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
timer1.Enabled:=false;
button2.Click;
timer3.Enabled:=true;
end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
timer2.Enabled:=false;
button3.Click;
timer4.Enabled:=true;


end;

procedure TForm1.Timer4Timer(Sender: TObject);
begin
timer3.Enabled:=false;
button4.Click;
timer5.Enabled:=true;
end;

procedure TForm1.Timer5Timer(Sender: TObject);
begin
timer4.Enabled:=false;
button9.Click;
timer6.Enabled:=true;
end;

procedure TForm1.Timer6Timer(Sender: TObject);
begin
timer5.Enabled:=false;
button7.Click;
timer7.Enabled:=true;
end;

procedure TForm1.Timer7Timer(Sender: TObject);
begin
timer6.Enabled:=false;
WebBrowser1.OleObject.Document.GetElementByID('c_351').FOCUS;
WebBrowser1.OleObject.Document.GetElementByID('c_351').value :=edit3.Text;

WebBrowser1.OleObject.Document.GetElementByID('c_361').FOCUS;
WebBrowser1.OleObject.Document.GetElementByID('c_361').value:=edit4.Text;
//timer7 .Enabled:=false;
end;
Cevapla
#5
WebBrovser komponetinin "Event" larına baktınız mı ?

"OnDocumetComplete", "OnNavigateComplate2" ve "OnWebWorkerFinished" gibi durum kontrolleri var. İşinize yarayabilir diye düşünüyorum.
Cevapla
#6
Başka bir dille örneklendirdiğim için kusura bakmayın ama mantık aynı, elimde olmayan sebeplerden dolayı Delphi IDE si kuramıyorum bir süredir, hazır çalışan bir örnek sunmak isterdim.


global bir değişken tanımlayın

public static bool isLoaded = false;

Metotlar

public static void Sayfayuklendi()
{
   isLoaded = true;
} 

public static void SayfaYuklennesiniBekle(WebBrowser webbrowser1)
{
   isLoaded = false;
   while (isLoaded == false)
   {
      Application.DoEvents();
   }
}


Önemli

private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
   Sayfayuklendi();           
}

Kullanımı
public static void GirisYap(WebBrowser wb, string user, string pass)
{
   InternetSetOption(IntPtr.Zero, INTERNET_OPTION_END_BROWSER_SESSION, IntPtr.Zero, 0);
   wb.Navigate(ProcessHtml.LoginUrl);
   SayfaYuklennesiniBekle(wb);
   // işlemler vs ...
   SayfaYuklennesiniBekle(wb);
   // Linke git, linki tıkla ...
   SayfaYuklennesiniBekle(wb);
   // sayfa geldi devam          
}

Umarım mantığı anlatabilmişimdir.
Cevapla
#7
(08-09-2024, Saat: 16:59)Hayati Adlı Kullanıcıdan Alıntı: Başka bir dille örneklendirdiğim için kusura bakmayın ama mantık aynı, elimde olmayan sebeplerden dolayı Delphi IDE si kuramıyorum bir süredir, hazır çalışan bir örnek sunmak isterdim.


global bir değişken tanımlayın

public static bool isLoaded = false;

Metotlar

public static void Sayfayuklendi()
{
   isLoaded = true;
} 

public static void SayfaYuklennesiniBekle(WebBrowser webbrowser1)
{
   isLoaded = false;
   while (isLoaded == false)
   {
      Application.DoEvents();
   }
}


Önemli

private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
   Sayfayuklendi();           
}

Kullanımı
public static void GirisYap(WebBrowser wb, string user, string pass)
{
   InternetSetOption(IntPtr.Zero, INTERNET_OPTION_END_BROWSER_SESSION, IntPtr.Zero, 0);
   wb.Navigate(ProcessHtml.LoginUrl);
   SayfaYuklennesiniBekle(wb);
   // işlemler vs ...
   SayfaYuklennesiniBekle(wb);
   // Linke git, linki tıkla ...
   SayfaYuklennesiniBekle(wb);
   // sayfa geldi devam          
}

Umarım mantığı anlatabilmişimdir.

Kardeşim mantığı anladım. Ancak gerek kalmadı yaptığım işlemde gecikmeler olunca kullanıcı manuel ilerleme kararı aldı dolayısıyla sorun ortadan kalktı. İlgilendiğin için çok teşekkür ediyorum.

Arkadaşlar tekrardan merhaba Webbrowser bileşenini kullandığım projemde emin adımlarla ilerlerken web sitelerinin altyapısından kaynaklı çeşitli problemlerle karşılaşmaya başladım. paylaşmış olduğum kodlarla webde doldurulması gereken alanları sorunsuz dolduruyorum ancak ilk belgeyi aldıktan sonra yeni belge için başvuru ekranına tekrar geldiğimde nesne bulunamadı hatası alıyorum nedeni de yeni açılan sayfada input değerlerinin değişmesi ben bu problemin önüne nasıl geçebilirim.

WebBrowser1.OleObject.Document.GetElementByID('c_516').FOCUS;
WebBrowser1.OleObject.Document.GetElementByID('c_516').value :=FORM3.DBEdit1.Text;

Problemle ilgili görseller:
   

   

Görüldüğü üzere ilk belge alımında input değeri kod ile yazdığım değerle aynı ancak 2. belge için sayfayı açtığımda input değeri değişiyor
alanları sorunsuz şekilde doldurabilmem için projeyi komple kapatıp yeniden açmam gerekiyor.

İlgili Web Sitesinin Linki
Cevapla
#8
Bu durumda yerinizde olsam ve bu şekilde erişim zorunluluğum olsa ID'nin alacağı değeri tahmin etmeye çalışırdım.

Sadece beyin jimnastiği olsun diye yazıyorum, denemek görmek lazım :

Örneğin:
* ID'si "c_516" olanın 516 rakamı bu sayfanın ilk elemanından kaç fazla olduğunu alıp
bir sonraki turda "c_2338" için ilk elemanın sayısıyla farkı aynı mıdır diye kendinize sormak isteyebilirsiniz.

Tutarlı bir artış varsa sayfanın ilk elemanının numarasını almak ile dilediğiniz elemana odaklanacağınız bir referans elde edilmiş olacaktır.

Örneğin size bir fonksiyon hazırladım. Bunu kullanarak belli bir text içeren tag veya bir aşağıda vereceğim şekilde ilk INPUT elemanının ID'sini bulabilir bunu parse edip sayaç için referans olarak kullanabilirsiniz.


function MyFindElementId( aWebBrowser: TWebBrowser; aLabelText: string; aTag: string = 'span' ): String;
var
  aTags     : OleVariant;
  i         : Integer;
begin
  result := '';
  aTags    := aWebBrowser.OleObject.Document.all.tags( AnsiString(aTag) );
  i := 0;
  while ( i < aTags.length ) and (result = '' ) do
  begin
    if AnsiString(aLabelText) = aTags.item(i).InnerText
    then
      result := aTags.item(i).Id
    else
      inc(i);
  end;
  aTags    := Unassigned;
end;



Kullanımı :
var
  LElementRef : string;
begin
...
...
// İlk 'Kullanıcı Kodu' yazan SPAN tagının ID'si 
  LElementRef := MyFindElementId( aWebBrowser, 'Kullanıcı Kodu', 'span' );
  ShowMessageFmt('Bulunan Ref: %s', [ LElementRef  ]);

// İlk INPUT elemanı ID'si
  Showmessage( MyFindElementId( aWebBrowser, '', 'INPUT')  );

...
...

end;



Diğer yandan bu elemanlar sayısı statik ise illaki de GetElementById demenize veya referans takibine gerek kalmazdı, onun yerine
 
aWebBrowser.OleObject.Document.forms.item(1).submit;

gibisinden bir yaklaşımla direkt item index'inden faydalınabilirdi.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#9
(19-09-2024, Saat: 11:20)mrmarman Adlı Kullanıcıdan Alıntı: Bu durumda yerinizde olsam ve bu şekilde erişim zorunluluğum olsa ID'nin alacağı değeri tahmin etmeye çalışırdım.

Sadece beyin jimnastiği olsun diye yazıyorum, denemek görmek lazım :

Örneğin:
* ID'si "c_516" olanın 516 rakamı bu sayfanın ilk elemanından kaç fazla olduğunu alıp
bir sonraki turda "c_2338" için ilk elemanın sayısıyla farkı aynı mıdır diye kendinize sormak isteyebilirsiniz.

Tutarlı bir artış varsa sayfanın ilk elemanının numarasını almak ile dilediğiniz elemana odaklanacağınız bir referans elde edilmiş olacaktır.

Örneğin size bir fonksiyon hazırladım. Bunu kullanarak belli bir text içeren tag veya bir aşağıda vereceğim şekilde ilk INPUT elemanının ID'sini bulabilir bunu parse edip sayaç için referans olarak kullanabilirsiniz.


function MyFindElementId( aWebBrowser: TWebBrowser; aLabelText: string; aTag: string = 'span' ): String;
var
  aTags     : OleVariant;
  i         : Integer;
begin
  result := '';
  aTags    := aWebBrowser.OleObject.Document.all.tags( AnsiString(aTag) );
  i := 0;
  while ( i < aTags.length ) and (result = '' ) do
  begin
    if AnsiString(aLabelText) = aTags.item(i).InnerText
    then
      result := aTags.item(i).Id
    else
      inc(i);
  end;
  aTags    := Unassigned;
end;



Kullanımı :
var
  LElementRef : string;
begin
...
...
// İlk 'Kullanıcı Kodu' yazan SPAN tagının ID'si 
  LElementRef := MyFindElementId( aWebBrowser, 'Kullanıcı Kodu', 'span' );
  ShowMessageFmt('Bulunan Ref: %s', [ LElementRef  ]);

// İlk INPUT elemanı ID'si
  Showmessage( MyFindElementId( aWebBrowser, '', 'INPUT')  );

...
...

end;



Diğer yandan bu elemanlar sayısı statik ise illaki de GetElementById demenize veya referans takibine gerek kalmazdı, onun yerine
 
aWebBrowser.OleObject.Document.forms.item(1).submit;

gibisinden bir yaklaşımla direkt item index'inden faydalınabilirdi.
Sayın Muharrem ARMAN hocam sizin uyarınızı dikkate alarak öncelikle ilgili web sitesinde elementletin statik olup olmama konusunu araştırdım ve aşağıdaki yine sizin yazmış olduğunuz kodla statik olduklarını gördüm.

procedure TForm1.Button1Click(Sender: TObject);
Var
 i,j : Integer;
begin

 while WebBrowser1.ReadyState <> ReadyState_Complete do Application.ProcessMessages;
 Memo1.Lines.Clear;
 if WebBrowser1.OleObject.Document.Frames.Length > 0 then begin
   Memo1.Lines.Add('');
   Memo1.Lines.Add('-----------------------------');
   Memo1.Lines.Add('FRAMES bilgileri');
   Memo1.Lines.Add('-----------------------------');
   for i := 0 to WebBrowser1.OleObject.Document.Frames.Length - 1 do
   begin
     Memo1.Lines.Add( Format('WebBrowser1.OleObject.Document.Frames.Item(%d)', [i]) );
   end;
 end;

 if WebBrowser1.OleObject.Document.Forms.Length > 0 then begin
   Memo1.Lines.Add('');
   Memo1.Lines.Add('-----------------------------');
   Memo1.Lines.Add('FORMS bilgileri');
   Memo1.Lines.Add('-----------------------------');
   for i := 0 to WebBrowser1.OleObject.Document.Forms.Length - 1 do
   begin
     Memo1.Lines.Add( Format('WebBrowser1.OleObject.Document.Forms.Item(%d).Document.Body.InnerHTML', [i]) );
     for j := 0 to WebBrowser1.OleObject.Document.Forms.Item(i).Elements.Length - 1 do begin
       Memo1.Lines.Add( Format('  WebBrowser1.OleObject.Document.Forms.Item(%d).Elements.Item(%d).name -> ''%s'' ', [i, j, WebBrowser1.OleObject.Document.Forms.Item(i).Elements.Item(j).Name ]) );
     end;
   end;
 end;
 ShowMessage('Bitti');
end;

sonra ilgili siteye giderek vermiş olduğunuz kodu denedim.

WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(1).VALUE   := '1';
WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(2).VALUE   := '2';
WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(3).VALUE   := '3';
WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(4).VALUE   := '4';
WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(5).VALUE   := '5';
WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(6).VALUE   := '6';
WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(7).VALUE   := '7';
WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(8).VALUE   := '8';
WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(9).VALUE   := '9';
WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(10).VALUE   := '10';

deneme yanılma sonucu aşağıdaki görüntüye ulaştım. Dolayısıyla elementlerin item sıralarına ulaşmış oldum.

   

buraya kadar problem yok. Ancak seçmeli (combobox) alanlarda takıldım kaldım aslında o alanlarında item sıra numarasını belirledim ancak seçtirme işlemini beceremedim. Aşağıdaki kodu denediğimde sadece comboboxun içini boşaltıyor ancak seçme işlemi yapmıyor. Bu konuda da yardımınızı bekliyorum.

WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(19).VALUE   := 'ADET';

İlgili combobox ve hiyerarşik yapı aşağıdaki görseldeki gibidir.

   
Cevapla
#10
burası bir selectelement olduğunu farketmişsiniz.

element'i IHTMLSelectElement olarak değerlendirip istediğiniz indexi seçmelisiniz.

Bu anahtar kelimeyi arayarak nasılını bulabilirsiniz, bilgisayar başında olmadığım için örnek veremiyorum
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi Arayüz sorunu noname101 3 151 Dün, Saat: 12:38
Son Yorum: frmman
  form close de form bosalmiyor sadikacar60 8 180 18-01-2025, Saat: 09:37
Son Yorum: esistem
  Delphi Test Otomasyonu baslaner 5 6.050 28-12-2024, Saat: 22:33
Son Yorum: hasantester
  Delphi Öğenci Kurulum samet1818 3 200 23-12-2024, Saat: 13:32
Son Yorum: Mr.X
  Main form status barında mdichild isimlerini görüntüleme nevzatc 2 181 15-12-2024, Saat: 20:36
Son Yorum: nevzatc



Konuyu Okuyanlar: 1 Ziyaretçi