Önemli web sitesindeki elemanların idlerine ulaşamıyorum

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
eren2000
Üye
Mesajlar: 126
Kayıt: 26 Haz 2003 06:40
Konum: aksaray
İletişim:

Önemli web sitesindeki elemanların idlerine ulaşamıyorum

Mesaj gönderen eren2000 »

Bir sisteme web sayfası üzerinden veri girişi yapmak gibi çok saçma bir işle karşı karşıya kaldık. Yetkililer web servisi oluşturmayı kabul etmediler biz de kısıtlı bir zamanımız olduğu için verileri elle tek tek girmek yerine daha önce kullanılan programdan web sayfası üzerinden sisteme girmeye çalışıyoruz. Ama çok zor bir işle uğraştığımızın farkındayım. Burada özellikle MARMAN hocamın çok faydalı bilgilerinden bir çok şey öğrendim onun yaptıklarını kendi sistemime uygulmaya çalıştım. Kiminde başarılı oldum ama bazı sorunları çözemedim.
Bunlardan bir tanesi login sayfasına verileri inputlara yazdırıp sisteme giriş yaptığımda gelen 2.sayfadaki elementler birer image olarak gösterilmiş ve bunların idleri yok buton olmadığı için click olayını da yapamadım. Böyle bir nesneye nasıl bir komut gönderirsek click olayı gerçekleşir?
İkinci ve en önemli sorun bir sayfadayken bir tuşa basıyorsunuz sayfanın içerisinde bir pencere açılıyor ve bu penceredeki nesnelere erişemiyorum. iframe vb ile ilgili denemeler yaptım ama olmadı.
Üçüncüsü ise ajax ile ilgil olduğunu tahmin ediyorum bir comboboxta seçilen bir nesneden sonra comboboxın kapanma olayına göre bir liste çıkıyor bunu yakalayamıyorum.

eğer ilgilenen olursa
url :http://tbs.tarim.gov.tr/login.aspx
giriş için tc ve şifreyi özelden veririm denemek isteyenler için.
İlginiz için teşekkürler

Önemli not : Bu sisteme veri girişi çok önemlidir. Yardımlarınızı bekliyorum.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Önemli web sitesindeki elemanların idlerine ulaşamıyorum

Mesaj gönderen mrmarman »

Özelden bir tane login bilgisi verirsen uygun bir zamanda incelerim. Resimli giriş ekranını merak ettim :?:

Yaptığını söylediğin login işlemi aşağıdaki şekilde sanırım...

Kod: Tümünü seç

Const
  strTCNo  = '10000000147';
  strPass  = '12345678';
Var
  strCaptcha : String = 'TEST';

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://tbs.tarim.gov.tr/login.aspx');
  while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do
  begin
    Sleep(1);
    Application.ProcessMessages;
  end;
  WebBrowser1.OleObject.Document.GetElementByID('bodyCPH_username').Value   := strTCNo;
  WebBrowser1.OleObject.Document.GetElementByID('bodyCPH_pass').Value       := strPass;
  WebBrowser1.OleObject.Document.GetElementByID('bodyCPH_txtCaptcha').Value := strCaptcha;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  WebBrowser1.OleObject.Document.GetElementByID('bodyCPH_btnLogin').Click;
end;
Resim
Resim ....Resim
eren2000
Üye
Mesajlar: 126
Kayıt: 26 Haz 2003 06:40
Konum: aksaray
İletişim:

Re: Önemli web sitesindeki elemanların idlerine ulaşamıyorum

Mesaj gönderen eren2000 »

Evet hocam o şekilde. Orada sorun yok. Ondan sonra login olup sisteme girince sorun yaşamıştım ama onu da şöyle çözdüm. Resimde yazılan etiketleri sayfada arattırıp bunların bulunduğu yerdeki href ile referans verilen adrese navigate ile yönlendirdim. Bu sorun da çözüldü.
Şimdi diğer sayfalarda üstüste açılan 2.penceredeki elementlere erişememe sıkıntım var.
Bir de comboboxlar da listeden seçilen veriye göre liste gelmesi e onların okunması işlemini yapamadım. Bu ajax ile alakalı bir olay sanırım ama beceremedim.
Sizin sayenizde bir çok şey öğrendim. Teşekkürler.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Önemli web sitesindeki elemanların idlerine ulaşamıyorum

Mesaj gönderen mrmarman »

ComboBox değişikliğini kendin yapacaksan, HTML kaynak kodunda muhtemelen şu şekilde bir JAVASCRIPT görürsün

Kod: Tümünü seç

javascript:setTimeout('__doPostBack(\elementadi
Bu kısmı

Kod: Tümünü seç

execScript(JSFn, 'JavaScript');
ile çalıştırırsan AJAX motoru çalışacak alt combobox'lar dolacaktır.
Dolduğunu da HTML InnerText veya InnerHTML ile kontrol edip kaynak HTML koddaki değişime bakarak anlayabilirsiniz.

Başarılar.
Resim
Resim ....Resim
eren2000
Üye
Mesajlar: 126
Kayıt: 26 Haz 2003 06:40
Konum: aksaray
İletişim:

Re: Önemli web sitesindeki elemanların idlerine ulaşamıyorum

Mesaj gönderen eren2000 »

Hocam,
tc ve şifreyi aldıysanız müsait zamanda bakarsanız sanırım olayı kısa zamanda çözersiniz. Orada mesela numune listesi seçilince bir sayfa açılıyor. O sayfada en başta laboratuvar comboboxtan seçilince laboratuvar ismi labela yazıyor. Ben numarayı otomatik yazdırıyorum. Sonra ara düğmesine basıyorum. Fakat comboboxtan numarayı seçme işlemini elle yapıyormuş gibi aynısını yapmak istiyorum.
eren2000
Üye
Mesajlar: 126
Kayıt: 26 Haz 2003 06:40
Konum: aksaray
İletişim:

Re: Önemli web sitesindeki elemanların idlerine ulaşamıyorum

Mesaj gönderen eren2000 »

diğer bir sorunu da şu şekilde hallettim.

WebBrowser1.OleObject.Document.frames.item(f).document.forms.item(g).elements.item('ctl00$ContentPlaceHolder1$CorparationControl$edtRealPersonIdNo').value := edit1.text;
WebBrowser1.OleObject.Document.frames.item(f).document.forms.item(g).elements.item('ctl00ctl00_bodyCPH_ContentPlaceHolder1_CorparationControl_edtRealPersonIdNo_ClientState').value :='{"enabled":true,"emptyMessage":"","validationText":"","valueAsString":"","valueWithPromptAndLiterals":""}';
WebBrowser1.OleObject.Document.frames.item(f).document.forms.item(g).elements.item('ContentPlaceHolder1_CorparationControl_btnSearchRealPerson').Click;

Burada bir sıkıntı var yalnız nesnenin id ve name değerleri aynı. Bu yüzden elements.item değeri name parametre alıyor. id parametre alması için ne yazmam gerektiğini bulamadım.
eren2000
Üye
Mesajlar: 126
Kayıt: 26 Haz 2003 06:40
Konum: aksaray
İletişim:

Re: Önemli web sitesindeki elemanların idlerine ulaşamıyorum

Mesaj gönderen eren2000 »

Kodla aşağıdaki etiketi yazdıramadım. Bilenler varsa yardım lütfen.

Kaynak bu;

Kod: Tümünü seç

<span id="ctl00_ctl00_bodyCPH_ContentPlaceHolder1_RadPanelBar1_i0_Label4" class="formLabel" style="color: red; font-size: medium; font-weight: bold; visibility: visible;">UTKU TOPRAK ANALİZ LABORATUVARI</span>
Benim yazdığım delphi kodu bu;

Kod: Tümünü seç

WebBrowser1.OleObject.Document.getElementByID('ctl00_ctl00_bodyCPH_ContentPlaceHolder1_RadPanelBar1_i0_Label4').Value:='UTKU TOPRAK ANALİZ LABORATUVARI';
Bir sorum daha olacak ;
Sayfadaki comboboxı açıp elle tıklıyormuş gibi yani bir eleman seçme işlemini kod ile nasıl yapabiliriz.
Ben direk veriyi orya yazdırıyorum ama combobox open ve close işlemini yapmasını istiyorum.
Benim yaptığım şöyle ;

Kod: Tümünü seç

WebBrowser1.OleObject.Document.getElementByID('ctl00_ctl00_bodyCPH_ContentPlaceHolder1_RadPanelBar1_i0_cmbLabList_Input').Value:='LAB-1731';
    WebBrowser1.OleObject.Document.getElementByID('ctl00_ctl00_bodyCPH_ContentPlaceHolder1_RadPanelBar1_i0_cmbLabList_Input').FireEvent('onkeydown' , tmpObj) ;
    Keybd_Event(VK_RETURN,   1, 0, 0);        // Enter tuşu
Ama istediğimi karşılamıyor.

Bu arada diğer sorunların bir çoğunu çözdüm. Üste açılan frame deki formlara da erişip oradaki nesnelere ulaşabiliyorum. Bu işlem benim önümü açtı diyebilirim.
Ama itiraf etmek lazım ki biraz ezbere ve bilinçsizce gittiğimi düşünüyorum.
Buradan Muharrem hocama bir kez daha teşekkür ediyorum çok emeği geçti.
eren2000
Üye
Mesajlar: 126
Kayıt: 26 Haz 2003 06:40
Konum: aksaray
İletişim:

Re: Önemli web sitesindeki elemanların idlerine ulaşamıyorum

Mesaj gönderen eren2000 »

Arkadaşlar,

Kod: Tümünü seç

<input id="ctl00_ContentPlaceHolder1_CorparationControl_edtRealPersonIdNo" name="ctl00$ContentPlaceHolder1$CorparationControl$edtRealPersonIdNo" type="text" size="20" class="riTextBox riEnabled formText" value=" ">
Bu nesneye aşağıdaki kod ile erişiyorum.

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
var
  g, f, k : integer;
  pDispatch : IDISPATCH;
  textarea: IHTMLTextAreaElement;
begin
   WebBrowser1.OleObject.Document.frames.item(f).document.forms.item(g).elements.item('ctl00$ContentPlaceHolder1$CorparationControl$edtRealPersonIdNo').value := '49237370432';
end;
Fakat şu nesneye,

Kod: Tümünü seç

<input id="ctl00_ContentPlaceHolder1_CorparationControl_edtRealPersonIdNo_ClientState" name="ctl00_ContentPlaceHolder1_CorparationControl_edtRealPersonIdNo_ClientState" type="hidden" autocomplete="off" value="{"enabled":true,"emptyMessage":"","validationText":"49657356498","valueAsString":"49657356498","valueWithPromptAndLiterals":"49657356498"}">
Bu kod ile erişemiyorum.

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
var
  g, f, k : integer;
  pDispatch : IDISPATCH;
  textarea: IHTMLTextAreaElement;
begin
   WebBrowser1.OleObject.Document.frames.item(f).document.forms.item(g).elements.item('ctl00_ContentPlaceHolder1_CorparationControl_edtRealPersonIdNo_ClientState').value := '{"enabled":true,"emptyMessage":"","validationText":"49237370432","valueAsString":"49237370432","valueWithPromptAndLiterals":"49237370432"}';
end;
Burada dikkat etmenizi istediğim nokta 2.nesnenin id ve name ikisi de aynı. Bu nesneye nasıl değer atayabilirim.
eren2000
Üye
Mesajlar: 126
Kayıt: 26 Haz 2003 06:40
Konum: aksaray
İletişim:

Re: Önemli web sitesindeki elemanların idlerine ulaşamıyorum

Mesaj gönderen eren2000 »

Kod: Tümünü seç

<div id="ctl00_ctl00_bodyCPH_ContentPlaceHolder1_lbKapsamlar" class="RadListBox RadListBox_Metro RadListBoxScrollable" checkpermission="true" style="height:200px;width:400px;">
			<div class="rlbGroup rlbGroupRight">
				<ul class="rlbList">
					<li id="ctl00_ctl00_bodyCPH_ContentPlaceHolder1_lbKapsamlar_i0" class="rlbItem"><input type="checkbox" class="rlbCheck"><span class="rlbText">Toprakta Temel Analizler</span></li><li id="ctl00_ctl00_bodyCPH_ContentPlaceHolder1_lbKapsamlar_i1" disabled="disabled" class="rlbItem rlbDisabled"><input type="checkbox" class="rlbCheck" disabled="disabled"><span class="rlbText">Diğer Kapsamlar</span></li>
				</ul>
			</div><input id="ctl00_ctl00_bodyCPH_ContentPlaceHolder1_lbKapsamlar_ClientState" name="ctl00_ctl00_bodyCPH_ContentPlaceHolder1_lbKapsamlar_ClientState" type="hidden" autocomplete="off" value="{"isEnabled":true,"logEntries":[],"selectedIndices":[],"checkedIndices":[],"scrollPosition":0}">
		</div>

html sayfasında ulaşamadığım nesnenin bulunduğu kod bloğu burasıdır. Buradaki checkbox nesnesine ulaşamıyorum. Ulaşmaya çalışırken kullandığım id

Kod: Tümünü seç

id="ctl00_ctl00_bodyCPH_ContentPlaceHolder1_lbKapsamlar_i0"
acaba yanlış nesneylemi uğraşıyorum bilgisi olan varsa yardım ederse sevinirim.
eren2000
Üye
Mesajlar: 126
Kayıt: 26 Haz 2003 06:40
Konum: aksaray
İletişim:

Re: Önemli web sitesindeki elemanların idlerine ulaşamıyorum

Mesaj gönderen eren2000 »

Sorunları hallettim ve bir çok şey öğrendim emeği geçen arkadaşlara teşekkür ederim. Sorunları nasıl hallettiğimi kısa zaman sonra burada yazacağım fakat yetiştirmem gereken proje için zaman kalmadı o yüzden affınıza sığınıyorum.
eren2000
Üye
Mesajlar: 126
Kayıt: 26 Haz 2003 06:40
Konum: aksaray
İletişim:

Re: Önemli web sitesindeki elemanların idlerine ulaşamıyorum

Mesaj gönderen eren2000 »

Özellikle Muharrem hocam verdiği bilgilerle bizim önümüz açtı.Ayrıca SimaWB ve Volkan Kamadan'a da ayrıca teşekkür ederim. Başka sorulara verdikleri cevaplar çok işime yaradı.
Bir de şu ajax konusunu tam olarak çözebilseydik süper olurdu. Ama başka forumlara da baktım net bir çözüm malesef görünmüyor. Microsoft da doyurucu bir bilgi yayınlamamış. Biz de mecburen kendimize göre yöntemler icat ediyoruz ustalardan aldığımız bilgileri kullanarak.
Ajax da ondocumentcomplete ile işimi amatörce çözüyorum umarım daha iyi bir çözüm bulurum.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Önemli web sitesindeki elemanların idlerine ulaşamıyorum

Mesaj gönderen Lord_Ares »

isimleri aynı olan elemanlar için bende size şunu fikir olarak göstermek isterim gerçi siz çözüm yolunu bulmuşsunuz ama belki yinede yararı olur diye mrmarman hocamın paylaşmış olduğu kod örneğini burada bir kez daha paylaşmak istedim. Koddaki yaklaşım bize o sayfadaki kaçıncı formdaki, kacıncı item name veya id sini döndürüyor.
Böylelikle nameleri aynı olan bir çok eleman olsa bile, siz item nosu 4 olan ve name deneme olanı tıkla veya yaz diyebilmiş oluyorsunuz.
Bahsi geçen kod linki viewtopic.php?f=2&t=22005&hilit=+mrmarman

Bu kodu bizlerle paylaştığı için sayın mrmarman hocama tekrar teşekkür ediyorum. Ellerinize sağlık.

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  i,j : Integer;
begin
  WebBrowser1.Navigate('http://divxplanet.com/');
  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;
Sonuç :

Kod: Tümünü seç

-----------------------------
FRAMES bilgileri
-----------------------------
WebBrowser1.OleObject.Document.Frames.Item(0)
WebBrowser1.OleObject.Document.Frames.Item(1)

-----------------------------
FORMS bilgileri
-----------------------------
WebBrowser1.OleObject.Document.Forms.Item(0).Document.Body.InnerHTML
  WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(0).Name -> 'CookieDate' 
  WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(1).Name -> 'referer' 
  WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(2).Name -> 'UserName' 
  WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(3).Name -> 'PassWord' 
  WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(4).Name -> 'Hatirla' 
  WebBrowser1.OleObject.Document.Forms.Item(0).Elements.Item(5).Name -> '' 
WebBrowser1.OleObject.Document.Forms.Item(1).Document.Body.InnerHTML
  WebBrowser1.OleObject.Document.Forms.Item(1).Elements.Item(0).Name -> 'cx' 
  WebBrowser1.OleObject.Document.Forms.Item(1).Elements.Item(1).Name -> 'ie' 
  WebBrowser1.OleObject.Document.Forms.Item(1).Elements.Item(2).Name -> 'oe' 
  WebBrowser1.OleObject.Document.Forms.Item(1).Elements.Item(3).Name -> 'cof' 
  WebBrowser1.OleObject.Document.Forms.Item(1).Elements.Item(4).Name -> 'hl' 
  WebBrowser1.OleObject.Document.Forms.Item(1).Elements.Item(5).Name -> 'q' 
  WebBrowser1.OleObject.Document.Forms.Item(1).Elements.Item(6).Name -> 'sa' 
WebBrowser1.OleObject.Document.Forms.Item(2).Document.Body.InnerHTML
  WebBrowser1.OleObject.Document.Forms.Item(2).Elements.Item(0).Name -> 'arama' 
  WebBrowser1.OleObject.Document.Forms.Item(2).Elements.Item(1).Name -> 'src_select' 
  WebBrowser1.OleObject.Document.Forms.Item(2).Elements.Item(2).Name -> '' 
WebBrowser1.OleObject.Document.Forms.Item(3).Document.Body.InnerHTML
  WebBrowser1.OleObject.Document.Forms.Item(3).Elements.Item(0).Name -> 'dailyf' 
  WebBrowser1.OleObject.Document.Forms.Item(3).Elements.Item(1).Name -> ''
eren2000
Üye
Mesajlar: 126
Kayıt: 26 Haz 2003 06:40
Konum: aksaray
İletişim:

Re: Önemli web sitesindeki elemanların idlerine ulaşamıyorum

Mesaj gönderen eren2000 »

İlginize ve verdiğiniz çok değerli bilgiler için teşekkür ederim.Sorunları çözdüm aslında verilenleri dikkatli okusam bu kadar oyalanmazdım hepsinin cevabı forumda varmış onları okumuştum ama dikkat etmemişim. Teşekkürler. Forumda hepsinin cevabı olduğu için burada yazmaya gerek duymuyorum ama istenirse tekrar bu konu başlığı altında açıklarım. Başarılar diliyorum.
Cevapla