Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Twebbrowser und Image klick... die xxx'te Variante (https://www.delphipraxis.net/111189-twebbrowser-und-image-klick-die-xxxte-variante.html)

Der.Kaktus 31. Mär 2008 11:42


Twebbrowser und Image klick... die xxx'te Variante
 
Hallo DP'ler,

habe folgende HTML Seite und wuerde gern ein Image per Fernsteuerung druecken. Habe natuerlich vorher in der DP usw. alle Varianten ausprobiert aber leider ohne Erfolg bei "Image.click"."Focus" setzen geht..aber eben nicht klicken. Hat jemand ne Idee?

Danke im voraus!

.....

<div id="Layer1" style="position:absolute; left:78px; top:131px; width:460px; height:210px; z-index:3">
<form method="post" action="../cgi-bin/htm_term.cgi">
<table width="100%" align="center" background="">
<tr>
.........
</tr>
<tr>
<td height="19"><center><input type=image src="../images/f1.gif" width="45" height="45" alt="Funktion 1" name="funktion1"></center></td>
<td height="19"><center><input type=image src="../images/f2.gif" width="45" height="45" alt="Funktion 2" name="funktion2"></center></td>
<td height="19"><center><input type=image src="../images/f3.gif" width="45" height="45" alt="Funktion 3" name="funktion3"></center></td>
</tr>
</table>


</form>
</div>

toms 31. Mär 2008 19:27

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Hallo,

Hast du schon mal meine WB_ClickImage aus dem "Mini Webbrowser Demo" probiert?

Aufruf:
Delphi-Quellcode:
WB_ClickImage(Webbrowser1,'f1.gif');
Delphi-Quellcode:
procedure WB_ClickImage(WB: TWebbrowser; ImageSRC: string);
var
  iDoc: IHtmlDocument2;
  i: Integer;
  iDisp: IDispatch;
  iColl: IHTMLElementCollection;
  InputImage: HTMLInputImage;
begin
  if Assigned(WB.Document) then
  begin
    WB.Document.QueryInterface(IHTMLDocument2, iDoc);
    if Assigned(iDoc) then
    begin
      iDisp := iDoc.all.tags('INPUT');
      if Assigned(iDisp) then
      begin
        iDisp.QueryInterface(IHTMLElementCollection, iColl);
        if Assigned(iColl) then
        begin
          ImageSRC := AnsiUpperCase(ImageSRC);
          for i := 1 to iColl.Get_length do
          begin
            iDisp := iColl.item(Pred(i), 0);
            iDisp.QueryInterface(HTMLInputImage, InputImage);
            if Assigned(InputImage) then
            begin
              if Pos(ImageSRC, AnsiUpperCase(InputImage.src)) <> 0 then
              begin
                InputImage.Click;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
end;

Der.Kaktus 1. Apr 2008 06:51

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Jep, habe ich...geht nicht..auch die 2. Variante, die ich hier fand, kein Erfolg. Schneide ich aber Tastatur/Maus mit (winmacro) geht es. Aber dies Moeglichkeit moechte ich nicht.

toms 1. Apr 2008 07:22

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Zitat:

Zitat von Der.Kaktus
Jep, habe ich...geht nicht..auch die 2. Variante, die ich hier fand, kein Erfolg. Schneide ich aber Tastatur/Maus mit (winmacro) geht es. Aber dies Moeglichkeit moechte ich nicht.

Ich habe deinen HTML Code in eine htm gespeichert und erfolgreich getestet.
Könntest du den gesamten relevanten Code anhängen, so dass ich es testen kann?

Der.Kaktus 1. Apr 2008 07:35

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Kann ich leider nicht..iss Firmenintern...aber ich denke, die ham das im CGI abgeblockt..geht sowas?..die Events Onmouseclick Onmouseup etc. sind aber NIL.

toms 1. Apr 2008 07:40

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Zitat:

Zitat von Der.Kaktus
Kann ich leider nicht..iss Firmenintern...aber ich denke, die ham das im CGI abgeblockt..geht sowas?..die Events Onmouseclick Onmouseup etc. sind aber NIL.

Zur Not könntest du auch den Focus aufs Element setzen und Enter simulieren.

Der.Kaktus 1. Apr 2008 07:45

Re: Twebbrowser und Image klick... die xxx'te Variante
 
hab ich schon versucht und sogar "Space"..funktioniert aber nicht :(
Irgendwas ham die reinprogrammiert die Schlingel *gg*

toms 1. Apr 2008 07:51

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Zitat:

Zitat von Der.Kaktus
hab ich schon versucht und sogar "Space"..funktioniert aber nicht :(
Irgendwas ham die reinprogrammiert die Schlingel *gg*

Vielleicht wird die Mausposition abgefragt und wenn die Maus nicht über dem Element ist wird der Klick ignoriert.

Der.Kaktus 1. Apr 2008 07:53

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Jep, koennte sein..wie bekomm ich die dahin? Setcursorpos? ..Aber wo erhalte ich die Position des Elementes? Danke erstmal fuer Deine Muehe!!

toms 1. Apr 2008 07:56

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Zitat:

Zitat von Der.Kaktus
Jep, koennte sein..wie bekomm ich die dahin? Setcursorpos? ..Aber wo erhalte ich die Position des Elementes? Danke erstmal fuer Deine Muehe!!

Du kannst ja vorerst ausprobieren, ob es mit dieser Methode funktioniert.
D.h du bewegst den Mauszeiger über das Element und simulierst Enter.

Der.Kaktus 1. Apr 2008 08:00

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Zitat:

Du kannst ja vorerst ausprobieren, ob es mit dieser Methode funktioniert.
D.h du bewegst den Mauszeiger über das Element und simulierst Enter.
Wo bekomme ich die Aktuelle Position des Elementes, damit ich Setcursorpos einsetzen kann?

toms 1. Apr 2008 08:16

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Du kannst mal mit folgendem Code spielen (Auszug aus meinem WinSpy)

Delphi-Quellcode:
var
   r: TRect;
   Element: IHTMLElement;

Delphi-Quellcode:
          r.Left := Element.offsetLeft;
          r.Top := Element.offsetTop;
          repeat
            Element := Element.offsetParent;
            if Element <> nil then
            begin
              if (Element.tagName = 'TD') // if parent a table cell,
                then
              begin
                r.Left := r.Left + (Element as IHTMLElement2).ClientLeft; // append cell border width to calcs
                r.Top := r.Top + (Element as IHTMLElement2).clientTop;
              end;
              r.Left := r.Left + Element.offsetLeft;
              r.Top := r.Top + Element.offsetTop;
            end;
          until Element = nil;

Der.Kaktus 1. Apr 2008 08:23

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Danke, werde es morgen mal probieren, da ich heute nicht auf Arbeit bin.

Der.Kaktus 2. Apr 2008 11:08

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Hallo, habe mit dem Code bissl rumgespielt aber ausser eine Zugriffsverletzung brachte es keinen Erfolg.

hier mal mein Codeschnippsel...vielleicht habe ich nen Denkfehler.

Delphi-Quellcode:
procedure TForm1.click_pic(s_pic:string);
var
  iDoc: IHtmlDocument2;
  i: integer;
  ov: OleVariant;
  iDisp: IDispatch;
  iColl: IHTMLElementCollection;
  InputImage: HTMLInputImage;
  r: TRect;
  tp:TPoint;
  Element: IHTMLElement;

begin
  Wb.ControlInterface.Document.QueryInterface(IHtmlDocument2, iDoc);
  if not Assigned(iDoc) then
  begin
    Exit;
  end;
  ov := 'INPUT';
  iDisp := iDoc.all.tags(ov);
  if Assigned(IDisp) then
  begin
    IDisp.QueryInterface(IHTMLElementCollection, iColl);
    if Assigned(iColl) then
    begin
      i:=iColl.Get_length;
      for i := 1 to iColl.Get_length do //iColl.Get_length=0 worduch es nicht weiter geht
      begin
        iDisp := iColl.item(pred(i), 0);
        iDisp.QueryInterface(HTMLInputImage, InputImage);
        if Assigned(InputImage) then
        begin
          if pos(s_pic,InputImage.Name)<>0 then
          // if the name is submit / falls der name submit lautet
          begin
           inputimage.focus;
            //InputImage.click; // click it / klick es
           r.Left := Inputimage.offsetLeft;
           r.Top := Inputimage.offsetTop;
           element:=inputimage.offsetparent;
           repeat
            if Element <> nil then
            begin
               if (Element.tagName = 'TD') // if parent a table cell,
                then
               begin
                r.Left := r.Left + (Element as IHTMLElement2).ClientLeft; // append cell border width to calcs
                r.Top := r.Top + (Element as IHTMLElement2).clientTop;
               end;
              r.Left := r.Left + Element.offsetLeft;
              r.Top := r.Top + Element.offsetTop; // <----- hier geht er Heim steht auch im tagNamen nichts gescheites drin
             end;
           Element := Element.offsetParent;
           until Element = nil;
           tp.x:=r.Left+10;
           tp.y:=r.Top+10;
           wb.clienttoscreen(tp);
           windows.setcursorpos(tp.x,tp.y);
....

marabu 2. Apr 2008 11:34

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Hallo ihr beiden,

ein paar Fragen:

Das Image wird in jedem Fall gefunden?
Der Aufruf der Methode Click() scheitert?
Was genau funktioniert nicht?

Maßnahmen zur Aushebelung der Automatisierung werden auf der Client-Seite getroffen. Ist entsprechender Script-Code im HTML-Dokument vorhanden?

Nicht zuletzt: Stammt das Markup im Beitrag #1 aus einem Frame?

Freundliche Grüße

Der.Kaktus 2. Apr 2008 11:48

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Hallo marabu,

1: Image wird gefunden..Focus kann ich setzen
2: click scheitert
3: ich wollte nun probieren, den Mousecursor auf das Image zu setzen und einen Mouseclick zu simulieren. Leider scheitert es noch bei Positionsfindung.
4: nur das CGI ..kein Frame

marabu 2. Apr 2008 12:02

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Dann sollte es dir gelingen die firmenspezifischen Teile der Seite zu entfernen, so dass mit der abgespeckten Seite das Verhalten nachgestellt werden kann. Es ist dann viel leichter zu helfen ...

Der.Kaktus 2. Apr 2008 12:59

Re: Twebbrowser und Image klick... die xxx'te Variante
 
@marabu
habe eben mal eine Variante getestet(ohne das cgi)..da geht click()..scheint doch im CGI abgefangen zu werden.Also doch die Variante mit Mouseposition und dann Mouseclick.

marabu 2. Apr 2008 14:09

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Wenn die Art der Benutzer-Interaktion im CGI behandelt werden soll, dann muss der Klick vorher ausgelöst worden sein und zu einem HTTP-Request geführt haben.

Wenn eine Server-Erweiterung (CGI, FastCGI, ISAPI, ...) auf die Art der Benutzer-Interaktion reagieren soll, dann benötigt sie ein per POST-Variable oder HTTP-Header übermitteltes Kriterium. Du könntest also den Request testweise auf einen eigenen Server umleiten, damit du die übermittelten Werte untersuchen kannst.

Wenn du keine unverfängliche Testseite zur Verfügung stellen kannst, dann ist leider keine gezielte Hilfe von außen möglich.

Der.Kaktus 2. Apr 2008 14:57

Re: Twebbrowser und Image klick... die xxx'te Variante
 
@marabu
Wie auf meinem HTML Auszug ersichtlich ist, wird ueber eine "post" Variable ein CGI Servererweiterung aufgerufen. An diese Datei komme ich aber leider nicht ran. Danke trotzdem.

marabu 2. Apr 2008 15:05

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Liegt hier ein Missverständnis vor? Niemand benötigt das CGI-Modul, es genügt die anonymisierte HTML-Datei, mit der sich das Verhalten nachstellen lässt. Ein passendes CGI-Modul kann ich mir zur Not selbst bauen.

Der.Kaktus 2. Apr 2008 18:53

Re: Twebbrowser und Image klick... die xxx'te Variante
 
@toms kannst Du mal bitte den Quelltext anschauen mit dem Ausschnitt aus Deinem Winspy?..Danke

@marabu es liegt sicher ein Missverstaendnis vor...der Ausschnitt am Anfang dieses Threads ist die HTML Quelle ohne interne Texte... mehr ist nicht...die Variante, ohne CGI, da funktioniert auch die Image.click() Prozedure ..deshalb wohl doch die Variante mit Mouseclick nehmen muss.Danke

toms 3. Apr 2008 04:16

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Zitat:

Zitat von toms
Zitat:

Zitat von Der.Kaktus
Jep, koennte sein..wie bekomm ich die dahin? Setcursorpos? ..Aber wo erhalte ich die Position des Elementes? Danke erstmal fuer Deine Muehe!!

Du kannst ja vorerst ausprobieren, ob es mit dieser Methode funktioniert.
D.h du bewegst den Mauszeiger über das Element und simulierst Enter.

Funktioniert denn diese Methode überhaupt, konntest du es so erfolgreich testen?

Der.Kaktus 3. Apr 2008 04:48

Re: Twebbrowser und Image klick... die xxx'te Variante
 
@toms Guten Morgen,
habe rumgespielt (siehe Beitrag #14)...bekomme aber beim 1.OffsetParent keinen tagnamen??

busybyte 3. Apr 2008 05:24

Re: Twebbrowser und Image klick... die xxx'te Variante
 
//Edit gelöscht

Der.Kaktus 4. Apr 2008 06:48

Re: Twebbrowser und Image klick... die xxx'te Variante
 
habe die Befuerchtung, irgendwie werden die Parentparameter zwar gesetzt, aber die Adressen sind nicht richtig. Habe ich Denkfehler oder ist es ein Bug? :wall:

toms 6. Apr 2008 17:29

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Hallo,

Konntest du diese Methode denn erfolgreich testen bevor du die Element Position per Code berechnest?

Test:

- Die Maus manuell über den Submitbutton bewegen.
- z.B via Hotkey die Linke Maustaste simulieren.

Somit wirst du sehen, ob der Ansatz überhaupt funktionieren würde.

Der.Kaktus 7. Apr 2008 04:40

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Zitat:

Zitat von toms
Hallo,

Konntest du diese Methode denn erfolgreich testen bevor du die Element Position per Code berechnest?

Test:

- Die Maus manuell über den Submitbutton bewegen.
- z.B via Hotkey die Linke Maustaste simulieren.

Somit wirst du sehen, ob der Ansatz überhaupt funktionieren würde.


Guten Morgen,

Ja, funktioniert mit Hotkey und manueller Positionierung...eben erfolgreich getestet!!

toms 7. Apr 2008 05:48

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Delphi-Quellcode:
r.Left := r.Left + Element.offsetLeft;
r.Top := r.Top + Element.offsetTop; // <----- hier geht er Heim steht auch im tagNamen nichts gescheites drin
Ist es richtig, dass Element.offsetLeft noch korrekt ausgeführt wird und einen Wert zurück gibt; Element.offsetTop aber nicht?

Der.Kaktus 7. Apr 2008 05:56

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Ja,aber nur zufaellig weil da gerade ein Wert steht....die ganze Struktur des Zeigers stimmt nicht..im Element.tagName steht schon nichts(Irgendwelcher Speicher)drin.

toms 7. Apr 2008 06:00

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Delphi-Quellcode:
element:=inputimage.offsetparent;
ich denke, diese Zuweisung ist problematisch. Die Typen stimmen nicht überein.

Der.Kaktus 7. Apr 2008 06:09

Re: Twebbrowser und Image klick... die xxx'te Variante
 
Problem geloest!


Delphi-Quellcode:
Var Element:IHTMLElement;
// ersetzt element=inputimage.offsetparent  wegen fehlerhaften Zeiger'n
element:=idoc.activeElement.offsetParent // nach vorheriger Focusierung des gewuenschten Elementes

Danke!


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