Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
webbrowser element erişim sorunu
#1
Merhaba arkadaşlar webbrowser sayesinde bir web sitesini dolduruyorum.
WebBrowser.Document.QueryInterface(IHTMLDocument3,doc) ;
  marka := doc.getElementById('Markalar');

      if marka <> nil then begin
        (marka as IHTMLSelectElement).value := '29';
        (marka as IHTMLElement3).FireEvent('onchange', v);
      end;
WebBrowser.OleObject.Document.getElementById('modeller').value:= '369';  //modeller
yukarıdaki kodda olduğu gibi markalar selected box ına ait onchange eventini tetkiliyorum. 
hemen bir altındaki modeller selected boxının içi seçilen markanın modelleri ile doluyor. 

Fakat ben model selected boxına içindeki değerlerden birini yukarıdaki kodun çalışırken atayamıyorum. 
Sayfa yüklemesini bitirdikten sonra baska bir butona aşağıdaki kodu yazdığımda atama yapıyor.
WebBrowser1.OleObject.Document.getElementById('modeller').value:= '369';
model selected boxı markalara bağlı dolduğundan yakalam işlemini yapamıyorum sanırım. Bir çözüm yolu gösterecek arkadaşların yardımını bekliyorum.
Cevapla
#2
Tahminim; siz marka'nın OnChange olayını tetikleyince, sayfada AJAX ile yükleme yapılıyor ve modeller dolduruluyor. Sizin bu doldurma olayının bitişini yakalamanız gerekiyor.
AJAX sorgusu sonucunda WebBrowser'ın OnDocumentComplete olayı tetiklenir. Bunu kontrol edebilirsiniz.
There's no place like 127.0.0.1
WWW
Cevapla
#3
benim konuya yakın bir durum bahsedilmiş Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol fakat ben neden yakalayamıyorum. 
Sizin dediğiniz gibi OnDocumentComplete olayına bakacağım. teşekkürler cevap için.

WebBrowser.ReadyState <> READYSTATE_COMPLETE do begin
kodlar bundan sonra çalışıyor. sayfa yüklendikten sonra alanlar doluyor. bu nedenle dediğiniz şekilde yakalayamam sanırım.
Cevapla
#4
hala bir sonuca ulaşamadım
Cevapla
#5
(19-09-2017, Saat: 16:51)CumaParlak Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olyukarıdaki kodda olduğu gibi markalar selected box ına ait onchange eventini tetkiliyorum. 
hemen bir altındaki modeller selected boxının içi seçilen markanın modelleri ile doluyor. 

Merhaba, Peki modeller dolarken ekranda bir bekliyor işareti, barı vs çıkıyor mu ?
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#6
Aşağıdaki linki inceler misin,

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Ayrıca aşağıdaki linkte de istemediğin kadar kaynak bulabilirsin;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Bununla birlikte şurada da pratik örnekler yer alıyor;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Mutlaka birisi işini görecektir.
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Cevapla
#7
(20-09-2017, Saat: 09:20)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(19-09-2017, Saat: 16:51)CumaParlak Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olyukarıdaki kodda olduğu gibi markalar selected box ına ait onchange eventini tetkiliyorum. 
hemen bir altındaki modeller selected boxının içi seçilen markanın modelleri ile doluyor. 

Merhaba, Peki modeller dolarken ekranda bir bekliyor işareti, barı vs çıkıyor mu ?

yok hayır anında alt kutucuk doluyor.

(20-09-2017, Saat: 10:45)uparlayan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlAşağıdaki linki inceler misin,

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Ayrıca aşağıdaki linkte de istemediğin kadar kaynak bulabilirsin;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Bununla birlikte şurada da pratik örnekler yer alıyor;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Mutlaka birisi işini görecektir.

evet inceledim ve incelemeye devam edeceğim.
Cevapla
#8
unit Unit5;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
 System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw;

type
 TForm5 = class(TForm)
   WebBrowser1: TWebBrowser;
   procedure waitTillLoad1;
   procedure waitTillLoad2;
   procedure WebBrowser1DocumentComplete(ASender: TObject;
     const pDisp: IDispatch; const URL: OleVariant);

 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form5: TForm5;
 load: boolean;

implementation

{$R *.dfm}

procedure TForm5.waitTillLoad1;
var
 waittime, counter: integer;
 loadStatus: cardinal;
begin

 waittime := 9999999;
 counter := 0;
 while (true) do
 begin
   loadStatus := WebBrowser1.ReadyState;
   Application.ProcessMessages;

   if ((counter > waittime) or (loadStatus = READYSTATE_UNINITIALIZED) or
     (loadStatus = READYSTATE_LOADING) or
     (loadStatus = READYSTATE_UNINITIALIZED)) then
   begin
     break;
   end;
   inc(counter);
 end;

 while (true) do
 begin
   loadStatus := WebBrowser1.ReadyState;
   Application.ProcessMessages;

   if (loadStatus = READYSTATE_COMPLETE) then
   begin
     break
   end;

 end;

end;

procedure TForm5.waitTillLoad2;
var
 waittime, counter: integer;
begin
 load := false;
 waittime := 1000000;
 counter := 0;
 while (true) do
 begin
   Application.ProcessMessages;

   if (counter > waittime) or (load) then
   begin
     break;
   end;
   inc(counter);
 end ;
 while (not load ) do
 begin
   Application.ProcessMessages;
 end;
end;

 procedure TForm5.WebBrowser1DocumentComplete(ASender: TObject;
   const pDisp: IDispatch; const URL: OleVariant);
 begin
load:=true;
 end;

end.

Hocam yukarıdaki prosedürlerden biri işini görür.ReadyState sağlık çalışmayabiliyor bence  bu yüzden waitTillLoad2 ikiyi kullan daha iyi sonuç veriyor.Sadece waittime süresince beklemek istiyorsan alttaki while'lari yorum satırı haline getirebilirsin yada hep beklemek istiyorsan üsttekileri.

Ayrıca selected boxın değerini şu şekilde  değiştirmelisin.
void __fastcall TForm7::setselectedbox(_di_IHTMLElement element,String model)
{
_di_IHTMLSelectElement  pSelectElement=NULL;
element->QueryInterface(IID_IHTMLSelectElement, (void**)&pSelectElement);
int ElementCount = 0;
pSelectElement->Get_length(ElementCount);
OleVariant idx;

for (long ic=0; ic <ElementCount; ic ++)
{

idx.intVal=ic;
idx.VType=VT_I4;
_di_IDispatch pElementDisp = NULL;
pSelectElement->item(idx,idx,pElementDisp);
IHTMLOptionElement *pElement = NULL;
pElementDisp-> QueryInterface (IID_IHTMLOptionElement, (void **) &pElement);
WideString ws;
ws=pElement->text;

if(ws==model){
pSelectElement->Set_selectedIndex(ic);
break;
  }



}

}

Ben bunu delphiye çevirecek kadar delphi bilmiyorum yada çok uğraşmalıyım ama kavramlar tanıdık geleceği için bence sizler çevirebilirsiniz.

procedure TForm5.setselectedbox(element: IHTMLElement; model: String);
var
 ic, ElementCount: integer;
 pSelectElement: IHTMLSelectElement;
 idx: OleVariant;
 pElementDisp: IDispatch;
 pElement: IHTMLOptionElement;
Begin
 pSelectElement := nil;
 element.QueryInterface(IID_IHTMLSelectElement, pSelectElement);
 ElementCount := 0;
 ElementCount := pSelectElement.length;;
 for ic := 0 to ElementCount - 1 do
 begin

   idx.intVal := ic;
   idx.VType := varInteger;
   pElementDisp := nil;
   pElementDisp := pSelectElement.item(idx, idx);
   pElement := nil;
   pElementDisp.QueryInterface(IID_IHTMLOptionElement, pElement);

   if (pElement.text = model) then
   begin
     pSelectElement.selectedIndex := ic;
     break;
   end;

 end;

end;
waitTillLoad2 ;
setselectedbox(WebBrowser.OleObject.Document.getElementById('modeller'),'369');
Uğraştım çevirdim şunu dener misin hocam?
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla
#9
(20-09-2017, Saat: 18:31)savasabd Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
unit Unit5;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
 System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw;

type
 TForm5 = class(TForm)
   WebBrowser1: TWebBrowser;
   procedure waitTillLoad1;
   procedure waitTillLoad2;
   procedure WebBrowser1DocumentComplete(ASender: TObject;
     const pDisp: IDispatch; const URL: OleVariant);

 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form5: TForm5;
 load: boolean;

implementation

{$R *.dfm}

procedure TForm5.waitTillLoad1;
var
 waittime, counter: integer;
 loadStatus: cardinal;
begin

 waittime := 9999999;
 counter := 0;
 while (true) do
 begin
   loadStatus := WebBrowser1.ReadyState;
   Application.ProcessMessages;

   if ((counter > waittime) or (loadStatus = READYSTATE_UNINITIALIZED) or
     (loadStatus = READYSTATE_LOADING) or
     (loadStatus = READYSTATE_UNINITIALIZED)) then
   begin
     break;
   end;
   inc(counter);
 end;

 while (true) do
 begin
   loadStatus := WebBrowser1.ReadyState;
   Application.ProcessMessages;

   if (loadStatus = READYSTATE_COMPLETE) then
   begin
     break
   end;

 end;

end;

procedure TForm5.waitTillLoad2;
var
 waittime, counter: integer;
begin
 load := false;
 waittime := 1000000;
 counter := 0;
 while (true) do
 begin
   Application.ProcessMessages;

   if (counter > waittime) or (load) then
   begin
     break;
   end;
   inc(counter);
 end ;
 while (not load ) do
 begin
   Application.ProcessMessages;
 end;
end;

 procedure TForm5.WebBrowser1DocumentComplete(ASender: TObject;
   const pDisp: IDispatch; const URL: OleVariant);
 begin
load:=true;
 end;

end.

Hocam yukarıdaki prosedürlerden biri işini görür.ReadyState sağlık çalışmayabiliyor bence  bu yüzden waitTillLoad2 ikiyi kullan daha iyi sonuç veriyor.Sadece waittime süresince beklemek istiyorsan alttaki while'lari yorum satırı haline getirebilirsin yada hep beklemek istiyorsan üsttekileri.

Ayrıca selected boxın değerini şu şekilde  değiştirmelisin.
void __fastcall TForm7::setselectedbox(_di_IHTMLElement element,String model)
{
_di_IHTMLSelectElement  pSelectElement=NULL;
element->QueryInterface(IID_IHTMLSelectElement, (void**)&pSelectElement);
int ElementCount = 0;
pSelectElement->Get_length(ElementCount);
OleVariant idx;

for (long ic=0; ic <ElementCount; ic ++)
{

idx.intVal=ic;
idx.VType=VT_I4;
_di_IDispatch pElementDisp = NULL;
pSelectElement->item(idx,idx,pElementDisp);
IHTMLOptionElement *pElement = NULL;
pElementDisp-> QueryInterface (IID_IHTMLOptionElement, (void **) &pElement);
WideString ws;
ws=pElement->text;

if(ws==model){
pSelectElement->Set_selectedIndex(ic);
break;
  }



}

}

Ben bunu delphiye çevirecek kadar delphi bilmiyorum yada çok uğraşmalıyım ama kavramlar tanıdık geleceği için bence sizler çevirebilirsiniz.

procedure TForm5.setselectedbox(element: IHTMLElement; model: String);
var
 ic, ElementCount: integer;
 pSelectElement: IHTMLSelectElement;
 idx: OleVariant;
 pElementDisp: IDispatch;
 pElement: IHTMLOptionElement;
Begin
 pSelectElement := nil;
 element.QueryInterface(IID_IHTMLSelectElement, pSelectElement);
 ElementCount := 0;
 ElementCount := pSelectElement.length;;
 for ic := 0 to ElementCount - 1 do
 begin

   idx.intVal := ic;
   idx.VType := varInteger;
   pElementDisp := nil;
   pElementDisp := pSelectElement.item(idx, idx);
   pElement := nil;
   pElementDisp.QueryInterface(IID_IHTMLOptionElement, pElement);

   if (pElement.text = model) then
   begin
     pSelectElement.selectedIndex := ic;
     break;
   end;

 end;

end;
waitTillLoad2 ;
setselectedbox(WebBrowser.OleObject.Document.getElementById('modeller'),'369');
Uğraştım çevirdim şunu dener misin hocam?
öncelikle yardımlarınız için teşekkür ederim. Kodu denedim fakat değişen bir şey yok seçmiyor.
Cevapla
#10
waitTillLoad2 bu prosedürü de kullandın mı hocam?
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Lisanslama Sorunu Hk. glagher 11 503 07-07-2018, Saat: 10:40
Son Yorum: engerex
  pascal script ile QuickReport nesnelerine nasıl erişim yapılır theSinan 2 112 04-07-2018, Saat: 11:16
Son Yorum: hi_selamlar
  Aes şifreleme sorunu seci20 3 183 18-06-2018, Saat: 11:45
Son Yorum: sadettinpolat
  RSA anahtarı hesaplama sorunu seci20 8 336 14-06-2018, Saat: 15:19
Son Yorum: seci20
  DbBrowser-Veritabanı kilitlenme sorunu ? BY-HAYALET 2 128 08-06-2018, Saat: 21:13
Son Yorum: BY-HAYALET



Konuyu Okuyanlar: 1 Ziyaretçi