Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Editfelder in Farmes einer Website ansprechen (https://www.delphipraxis.net/106790-editfelder-farmes-einer-website-ansprechen.html)

P4CM4N 16. Jan 2008 19:06


Editfelder in Farmes einer Website ansprechen
 
Nachdem ich du suche jetzt schon ewig gequält, aber nichts gefunden habe, wende ich mich an euch.
Folgendes:
ich möchte auf einer Website, die in Frames aufgeteilt ist ein bestimmtes editfeld ansprechen. Ist ja an sich nicht so schwer. Nur ich kriegs trotzdem nicht hin :|

Hier mal ein Auszug aus dem Quelltext:
Delphi-Quellcode:
<form action="index.php?page=kante2&session=5b1b8fc101ee" method="POST">
  <table width="519" border="0" cellpadding="0" cellspacing="1">
          <tr height="20">

  <td colspan="4" class="c">Ecke</td>
   </tr>
   <tr height="20">
  <th>Leiste</th>
  <th>Vorhanden</th>

    <th>-</th>

    <th>-</th>
   </tr>
   <tr height="20">
    <th><a title="Speed: 22000">Freunde</a></th>
    <th>271<input type="hidden" name="maxship202" value="271"/></th>

     <input type="hidden" name="consumption202" value="20"/>
     <input type="hidden" name="speed202" value="22000" /></th>

     <input type="hidden" name="capacity202" value="5000" /></th>
     <th>[url="javascript:maxShip('ship202');"]max[/url] </th>
     <th><input name="ship202" size="10" value="0" alt="ascf"/></th>
   </tr>
<tr><th colspan=4>
</th></tr>
</form>
</table>






</center>

</div>

<script>
messageboxHeight=0;
errorboxHeight=0;
contentbox = document.getElementById('content');
</script>
Habs mal ein bisschen weiter kopiert, vielleicht hilft das.
Ich möchte den Wert des editfeldes mit dem Namen "ship202" von null auf 1 setzen. Wie geht das? :gruebel:

bitsetter 16. Jan 2008 20:21

Re: Editfelder in Farmes einer Website ansprechen
 
Hi,

versuche es mal mit:
Delphi-Quellcode:
WebBrowser1.OleObject.document.forms.item(0).elements.item('ship202').value:= 1;

marabu 16. Jan 2008 20:34

Re: Editfelder in Farmes einer Website ansprechen
 
Hallo,

wenn Frames vorhanden sind, dann besser so:

Delphi-Quellcode:
var
  vDoc, vFrame, vForm: OleVariant;
  iFrame, iForm: Integer;
  sElement: string;
begin
  // iFrame, iForm, sElement assumed valid
  vDoc := WebBrowser.OleObject.Document;
  vFrame := vDoc.frames.item(iFrame);
  vDoc := vFrame.contentWindow.Document;
  vForm := vDoc.forms.item(iForm);
  vForm.elements.item(sElement).value := '1';
end;
Statt über den Index kann auch über einen Namen auf die Form oder den Frame zugegriffen werden.

Grüße vom marabu

P4CM4N 18. Jan 2008 14:09

Re: Editfelder in Farmes einer Website ansprechen
 
Hi,
ich krieg ne Fehlermeldung in dieser Zeile
Delphi-Quellcode:
vDoc := WebBrowser.OleObject.Document;
[Error] Unit1.pas(42): Object or class type required

Was für einen type muss ich denn bennenen?

bitsetter 18. Jan 2008 20:52

Re: Editfelder in Farmes einer Website ansprechen
 
WebBrowser ist der Name der Komponente, also wenn du den nicht umbenannt hast:
Delphi-Quellcode:
vDoc := WebBrowser1.OleObject.Document;

P4CM4N 18. Jan 2008 21:56

Re: Editfelder in Farmes einer Website ansprechen
 
Ja, is klar. Delphi hat aber anscheinend mit dem OleObject ein Problem. Da muss man doch noch irgendwas in die uses schreiben, nur was?

mkinzler 18. Jan 2008 22:01

Re: Editfelder in Farmes einer Website ansprechen
 
Was für einen Typ hat WebBrowser?

bitsetter 18. Jan 2008 22:15

Re: Editfelder in Farmes einer Website ansprechen
 
Zitat:

Zitat von P4CM4N
Ja, is klar. Delphi hat aber anscheinend mit dem OleObject ein Problem. Da muss man doch noch irgendwas in die uses schreiben, nur was?

Achso, ich dachte du benutzt die Komponente TWebbrowser aus der SHDocVw_TLB.pas oder SHDocVw.pas, dann wäre die Meldung nämlich weg.

P4CM4N 19. Jan 2008 13:57

Re: Editfelder in Farmes einer Website ansprechen
 
Zitat:

Zitat von bitsetter
Zitat:

Zitat von P4CM4N
Ja, is klar. Delphi hat aber anscheinend mit dem OleObject ein Problem. Da muss man doch noch irgendwas in die uses schreiben, nur was?

Achso, ich dachte du benutzt die Komponente TWebbrowser aus der SHDocVw_TLB.pas oder SHDocVw.pas, dann wäre die Meldung nämlich weg.

Na die benutze ich doch. Hab jetzt schon beiddes ausprobiert, SHDocVW_TLB und die SHDocVw.pas. Geht beides irgendwie nicht.

marabu 19. Jan 2008 14:05

Re: Editfelder in Farmes einer Website ansprechen
 
Hallo PacMan,

befindet sich die Komponente TWebBrowser in deiner Palette?
Welche Delphi-Version setzt du ein?
Gibt es in deinem Verzeichnis $(DELPHI)\LIB die entsprechenden Units, die du einbinden möchtest?

Grüße vom marabu

P4CM4N 19. Jan 2008 14:27

Re: Editfelder in Farmes einer Website ansprechen
 
Zitat:

Zitat von marabu
befindet sich die Komponente TWebBrowser in deiner Palette?

Ja, es gibt 2 verschiedene Browser, einmal den normalen TWebbrowser und einmal Webbrowser_V1. Ich verwende den normalen.

Zitat:

Zitat von marabu
Welche Delphi-Version setzt du ein?

Delphi 7. Home oder so, nicht Professional.

Zitat:

Zitat von marabu
Gibt es in deinem Verzeichnis $(DELPHI)\LIB die entsprechenden Units, die du einbinden möchtest?

Hab ich jetzt eingefügt. Immer noch nichts. dann hab ich die Komponenten neu installiert, alsi mit dem pfad aus der Lib. Hat leider nicht geholfen. Ich kann ja mal den kompletten Quelltext posten

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, StdCtrls, SHDocVw_TLB;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    WebBrowser1: TWebBrowser;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Webbrowser1.Navigate(Edit1.TExt);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  vDoc, vFrame, vForm: OleVariant;
  iFrame, iForm: Integer;
  sElement: string;
begin
  //iFrame, iForm, sElement assumed valid
  vDoc := WebBrowser.OleObject.Document;
  vFrame := vDoc.frames.item(iFrame);
  vDoc := vFrame.contentWindow.Document;
  vForm := vDoc.forms.item(iForm);
  vForm.elements.item(sElement).value := '1';
end;


end.
Wie gesagt, in der Zeile
Delphi-Quellcode:
vDoc := WebBrowser.OleObject.Document;
kommt die Fehlermeldung.

marabu 19. Jan 2008 14:30

Re: Editfelder in Farmes einer Website ansprechen
 
Du hast die Variable immer noch nicht an deine Situation angepasst - bei dir heißt sie WebBrowser1.

Delphi-Quellcode:
vDoc := WebBrowser1.OleObject.Document;

P4CM4N 19. Jan 2008 15:21

Re: Editfelder in Farmes einer Website ansprechen
 
:wall:
Stimmt. Danke

P4CM4N 19. Jan 2008 15:29

Re: Editfelder in Farmes einer Website ansprechen
 
Und wie kriege ich jetzt raus, welce Werte ich für iFrame, iForm setzen muss, bzw. welchen Namen bei sElement?
Bei sElement muss ich ship202 zuweisen oder? Aber was bei dem rest :gruebel: Oder soll ich da jetzt so lange durchprobieren, bis es klappt?

marabu 19. Jan 2008 15:39

Re: Editfelder in Farmes einer Website ansprechen
 
Entweder du kennst den Namen des relevanten Frames oder du musst ihn über seinen Index (oder bei fehlender Eindeutigkeit des Namens über eine Kombination von beidem) ansprechen. Das gleiche gilt für die Form. Den Namen des Elements kennst du ja.

P4CM4N 19. Jan 2008 15:47

Re: Editfelder in Farmes einer Website ansprechen
 
Das ist das einzige, was ich zur Form finden kann
Delphi-Quellcode:
<form action="index.php?page=flotten2&session=f3351aef02c1" method="POST">
Ist da dann der Name das, was hinter Action steht?

Und das zum Frame
Delphi-Quellcode:
<div id='content'>
<center>
<script src="js/friends.js"></script>
<body>
<div id="overDiv" style="position:absolute; visibility:hidden; z-index:1000;"></div>
Ist jetzt der Name des frame 'content' oder 'overdiv'?

Sry, aber ich hab Quelltextlesen vorher noch nicht gemacht.

marabu 19. Jan 2008 17:14

Re: Editfelder in Farmes einer Website ansprechen
 
Deine Form ist nicht benannt. Einen Namen hätte sie, wenn eines der beiden Universal-Attribute id oder name vorhanden wäre. Wenn es die einzige Form im Frame ist, dann ist iForm auf 0 zu setzen und damit sprichst du die Form über ihren korrekten Index an.

Um den Namen oder den Index des Frames zu ermitteln musst du dir das Dokument mit den FrameSets anschauen. Du zeigst ja schon das markup des relevanten Frame und darin findest du weder Namen noch Hinweis auf den Index des Frames. Wenn der Frame keinen Namen besitzt, dann musst du nur alle enthaltenen Frames bis zum gewünschten Frame mit 0 beginnend durchzählen um den Index zu ermitteln.

P4CM4N 19. Jan 2008 18:26

Re: Editfelder in Farmes einer Website ansprechen
 
Wenn ich iFrame und Iform auf null setze krieg ich immer eine Acces Violation. was bedeutet das?
Sobald ich iFrame bzw. iForm etwas anderes als 0 zuweise kommt die Fehlermeldung "Mitglied nicht gefunden" -> heißt eigentlich, dass das Frame bzw. die Form nicht vorhanden ist.
Nur warum ist diese Nachricht auf deutsch??? Das Programm ist eigentlich Englisch.

bitsetter 19. Jan 2008 21:45

Re: Editfelder in Farmes einer Website ansprechen
 
Du kannst ja noch versuchen die Struktur der Seite in einem TTreeView darzustellen.
Delphi-Quellcode:
var
  vDoc, vFrame, vForm: OleVariant;
  iFrame, iForm, iElement: Integer;
  tn, tn2: TTreeNode;
begin
  vDoc := Webbrowser1.OleObject.Document;
  for iFrame:= 0 to vDoc.frames.Length -1 do
  begin
    vFrame := vDoc.frames.item(iFrame);
    tn:= TreeView1.Items.Add(nil, Format('frame %d', [iframe]));
      for iForm := 0 to vFrame.Document.forms.Length- 1 do
      begin
       tn2:= TreeView1.Items.AddChild(tn, Format('form %d', [iForm]));
       vForm:= vFrame.Document.forms.item(iForm);
       for iElement := 0 to vForm.elements.Length- 1 do
         TreeView1.Items.AddChild(tn2, Format('element %d', [iElement]));
     end;
  end;
  TreeView1.FullExpand;

P4CM4N 19. Jan 2008 22:29

Re: Editfelder in Farmes einer Website ansprechen
 
:pale: Funzt auch nicht...
"Zugriff verweigert".
Scheinbar will der Betreiber nicht, dass seine Seite ausgelesen wird. Oder kann man das auch irgendwie umgehen?

Fehler ab der Zeile
Delphi-Quellcode:
for iForm := 0 to vFrame.Document.forms.Length- 1 do

marabu 20. Jan 2008 18:08

Re: Editfelder in Farmes einer Website ansprechen
 
Hallo PacMan,

mit diesem Code navigiere ich zur Google-Seite und fülle das Eingabefeld q im Formular f:

Delphi-Quellcode:
unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, ComCtrls, StdCtrls, ExtCtrls, MSHTML;

type
  TDemoForm = class(TForm)
    Panel: TPanel;
    UrlEdit: TEdit;
    LoadButton: TButton;
    StatusBar: TStatusBar;
    WebBrowser: TWebBrowser;
    procedure LoadButtonClick(Sender: TObject);
    procedure WebBrowserDocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
  end;

var
  DemoForm: TDemoForm;

implementation

{$R *.dfm}

function GetFrameDoc(doc: IHTMLDocument2; v: OleVariant): IHTMLDocument2;
var
  win: IHTMLWindow2;
  u: IUnknown;
begin
  u := doc.frames.item(v);
  if Assigned(u)
  and Succeeded(u.QueryInterface(IHTMLWindow2, win))
    then Result := win.Document
    else Result := nil;
end;

// preconditions:
// - wb.Document fully loaded
// returns first vElement in first vForm in any frame
function GetInputElement(wb: IWebBrowser2; vForm, vElement: Variant): IHTMLInputElement;
var
  iFrame: Integer;
  doc, frameDoc: IHTMLDocument2;
  fe: IHTMLFormElement;
begin
  doc := wb.Document as IHTMLDocument2;
  if doc.frames.length = 0 then
  begin
    fe := doc.forms.item(vForm, 0) as IHTMLFormElement;
    if Assigned(fe)
      then Result := fe.item(vElement, 0) as IHTMLInputElement
      else Result := nil;
  end else
    for iFrame := 0 to Pred(doc.frames.length) do
    begin
      frameDoc := GetFrameDoc(doc, iFrame);
      fe := doc.forms.item(vForm, 0) as IHTMLFormElement;
      if Assigned(fe)
        then Result := fe.item(vElement, 0) as IHTMLInputElement
        else Result := nil;
      if Assigned(Result) then Exit;
    end;
end;

procedure TDemoForm.LoadButtonClick(Sender: TObject);
begin
  with WebBrowser do
    Navigate(UrlEdit.Text); // [url]http://www.google.de[/url]
end;

procedure TDemoForm.WebBrowserDocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  ie: IHTMLInputElement;
begin
  with Sender as TWebBrowser do
    if pDisp = DefaultInterface then
    begin
      ie := GetInputElement(DefaultInterface, 'f', 'q');
      if Assigned(ie)
        then ie.value := 'hasta la vista'
        else ShowMessage('bad luck');
    end;
end;

end.
Das müsste auch in einem FrameSet funktionieren, was ich aber nicht getestet habe. Wenn du damit immer noch Probleme hast, dann solltest du mal den URL geben.

Freundliche Grüße

P4CM4N 21. Jan 2008 13:22

Re: Editfelder in Farmes einer Website ansprechen
 
Kannst du mir vielleicht den Code erklären? Ich check da garnichts :gruebel:

marabu 21. Jan 2008 13:34

Re: Editfelder in Farmes einer Website ansprechen
 
Schreck lass nach - muss ich jede Zeile erklären?

Was genau verstehst du denn nicht?

P4CM4N 21. Jan 2008 18:24

Re: Editfelder in Farmes einer Website ansprechen
 
Nee, also die Zeile mit Unit und so is klar :mrgreen:

Mit diesem Programm durchsuchst du google.de nach forms, bzw. nach dem eingabefeld (q). Die Frameanzahl kriegst du hierdurch oder?
Zitat:

function GetFrameDoc(doc: IHTMLDocument2; v: OleVariant): IHTMLDocument2;
var
win: IHTMLWindow2;
u: IUnknown;
begin
u := doc.frames.item(v);
if Assigned(u)
and Succeeded(u.QueryInterface(IHTMLWindow2, win))
then Result := win.Document
else Result := nil;
end;

Nur wie das dann geht versteh ich nicht.


Und woher weißt du denn, des die Form "f" heißt und das Eingabefeld "q"?

marabu 21. Jan 2008 18:43

Re: Editfelder in Farmes einer Website ansprechen
 
Der einfache Teil der Arbeit ist die Ermittlung der Form- und Feldnamen: FireFox bietet dazu den Menübefehl "Extras | Seiteninformationen".

Die Anzahl der Frames erhalte ich über "doc.frames.length".
Mit GetFrameDoc() ermittle ich das Document eines bestimmten Frame.

Viele Code-Zeilen zeigen einfach nur Zugriffe auf das HTML DOM oder den Wechsel zwischen früher und später Bindung bei COM Objekten. Wenn das für dich noch Neuland ist, dann solltest du dich da mal einlesen. Das HTML DOM ist im MS Windows SDK beschrieben und für die COM Programmierung gibt es sicherlich Tutorials. Zu GetFrameDoc gibt es ein paar Threads in der DP, welche diese Funktion in einen Beispielkontext stellen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 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