Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Textfeld auslesen Webbrowser (https://www.delphipraxis.net/106771-textfeld-auslesen-webbrowser.html)

16. Jan 2008 14:01


Textfeld auslesen Webbrowser
 
Hi,

Ich habe ein Problem und zwar möchte ich gerne von einer Seite ein Formular auslesen.
Das Formular habe ich im Quelltext nicht gefunden, der komplette Quelltext besteht aus Javascript.
Jedoch in den Seiteninformationen, unter Formulare bin ich fündig geworden.

Das Feld hat folgende Eigenschaften:
- Feldname: itemprice
- Typ: text
- Wert: der für mich relevante bzw. interessante Wert

Nun nach lange rumprobieren bin ich bisher noch zu keiner Lösung gekommen.
Mein Ansatz war mit dem Webbrowser:

Delphi-Quellcode:
var test: String;
test := WebBrowser1.OleObject.document.forms.item(0).elements.item('itemprice').value
Doch das löst bei mir eine Exception aus.
Jemand einen Vorschlag bzw. eine Lösung wie ich das Textfeld in einen String einlesen kann?

Gruss Daniel

Bernhard Geyer 16. Jan 2008 14:24

Re: Textfeld auslesen Webbrowser
 
Wann wird der Code aufgerufen.
Kontrollier mal ob irgendeinteil deiner "Verreferenzierung" nil ist (Überwachte Ausdrücke im Debugger sind manchmal Gold wert).

17. Jan 2008 12:08

Re: Textfeld auslesen Webbrowser
 
Hi,

Delphi-Quellcode:
 Webbbrowser1.Navigate(URL);
 test := Webbrowser1.OleObject.document.forms.item(0).elements.item('itemprice').Value;
Würde es denn generell so gehen? Oder bin ich auf dem Holzweg?
Den Code selbst lese ich nicht aus, weil die Information nicht im Code steht bzw. für mich nicht ersichtlich.

Gruss Daniel

marabu 17. Jan 2008 12:38

Re: Textfeld auslesen Webbrowser
 
Hallo Daniel,

wenn diese beiden Code-Zeilen direkt hintereinander ausgeführt werden, dann bekommst du Zugriffsfehler oder bestenfalls falsche Inhalte. Erst wenn der Browser signalisiert, dass er die von dir gewünschte Seite auch geladen hat, kannst du auf das document object model zugreifen. Darauf wollte Bernhard hinaus.

Hier noch ein paar Infos, die auch für dich interessant sein sollten: klick

Grüße vom marabu

shmia 17. Jan 2008 12:48

Re: Textfeld auslesen Webbrowser
 
Zitat:

Zitat von finalr
Delphi-Quellcode:
 Webbbrowser1.Navigate(URL);
 test := Webbrowser1.OleObject.document.forms.item(0).elements.item('itemprice').Value;
Würde es denn generell so gehen? Oder bin ich auf dem Holzweg?

Das ist im Prinzip richtig. Nach .Navigate muss man allerdings warten, bis die Seite geladen wurde !!

Delphi-Quellcode:
var item:olevariant;
 Webbbrowser1.Navigate(URL);
 WaitForBrowser(Webbbrowser1); // Warten bis Document geladen
 if not Assigned(Webbrowser1.OleObject.document) then // Zur Sicherheit
    raise Exception.Create('kein Dokument geladen');
 item := Webbrowser1.OleObject.document.forms.item(0).elements.item('itemprice');
 if VarType(item) <> varNull then
    test := item.Value
 else
    test := 'itemprice nicht gefunden';
Delphi-Quellcode:
procedure WaitForBrowser(WebBrowser:TWebBrowser);
begin
   while WebBrowser.ReadyState <> READYSTATE_COMPLETE do
   begin
      Application.ProcessMessages;
      Sleep(50);
   end;
end;

17. Jan 2008 14:19

Re: Textfeld auslesen Webbrowser
 
Vielen Dank erstmal für die Antworten.

Ich habe mir hierfür ein Testproject angelegt, später soll alles in einer DLL...

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
 Halt;
end;

procedure TForm1.Button1Click(Sender: TObject);
var URL, Test: string;
begin
 URL := 'http...';

 Webbrowser1.Navigate(URL);
 Wait(Webbrowser1,400);

 Test := WebBrowser1.OleObject.document.forms.item(0).elements.item('itemprice').value;
end;

procedure TForm1.Wait(eWebbrowser: TWebbrowser; Delay: Integer);
begin
 Repeat
  Sleep(Delay);
  Application.ProcessMessages;
 Until (eWebbrowser.ReadyState = READYSTATE_COMPLETE) OR (Application.Terminated);
end;
Sorry, das ich euch das verschwiegen habe, aber die Wait-Procedure hatte ich auch schon drin. Aber das konntet ihr ja nicht wissen.

Konkrete Exception die er mir ausgibt:
"Zugriffsverletztung bei Adresse 0047003B in Modul 'Project1.exe."

Und Pointer auf die Zeile, wo ich den Wert in einen String speichern möchte.

Noch jemand eine Idee?

EDIT: Habe gerade versucht mit dem Code von shmia, aber auch kein Erfolg...bleibt an der gleiche Stelle hängen, wo er versucht das Textfeld auszulesen.

Ich hoffe, ihr habt mich nicht komplett falsch verstanden. Ich versuche nicht ein HTML-Textfeld auszulesen, sondern ein Feld, welches ich nur über die Seiteninformationen erreiche. Firefox -> Rechts klick -> Seiteninformationen anzeigen und im Reiter "Formulare" steht das begehrte "textfeld".

marabu 17. Jan 2008 18:16

Re: Textfeld auslesen Webbrowser
 
Hallo Daniel,

Zitat:

Zitat von Bernhard Geyer
... Kontrollier mal ob irgendeinteil deiner "Verreferenzierung" nil ist ...

die Kontrolle kann auch so aussehen:

Delphi-Quellcode:
var
  vDoc, vForm, vElement: OleVariant;
begin
  // ... load page ...
  vDoc := WebBrowser.OleObject.Document;
  if vDoc.forms.length > 0 then
  begin
    vForm := vDoc.forms.item(0);
    vElement := vForm.elements.item('itemprice');
    if VarIsNull(vElement)
      then ShowMessage('element not found')
      else ShowMessage(VarToStr(vElement.value));
  end else
    ShowMessage('no forms present');
end;
Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz