(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.