[
attachment=2768][
attachment=2769][
attachment=2770]
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;
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;
(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ı.
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;
WebBrovser komponetinin "Event" larına baktınız mı ?
"OnDocumetComplete", "OnNavigateComplate2" ve "OnWebWorkerFinished" gibi durum kontrolleri var. İşinize yarayabilir diye düşünüyorum.
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.
(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:
[
attachment=2778]
[
attachment=2779]
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
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
Kod:
aWebBrowser.OleObject.Document.forms.item(1).submit;
gibisinden bir yaklaşımla direkt item index'inden faydalınabilirdi.
(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
Kod:
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.
[
attachment=2780]
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.
[
attachment=2781]
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