Seite 1 von 1

Webgadget Felder automatisch ausfüllen im Hermes Paketschein

Verfasst: 17.06.2009 22:12
von hjbremer
Ich brauchte schon länger eine Möglichkeit Textfelder einer Webseite automatisch zu füllen.
Nun bin ich letztens auf ein Beisiel von Hroudtwolf: http://purebasic-lounge.com/viewtopic.php?t=5986 gestossen, mit dem man den Inhalt besagter Felder auslesen kann.

Mit etwas Probieren und unter Anwendung meiner mangelnden Englischkenntnisse ist es mir gelungen, den Code etwas umzubauen und Text in Felder hineinzuschreiben, als Abfallprodukt auch Checkboxen zu setzen. Bei Radiobuttons geht es auch, aber nur bei den Webseiten, wo diese keine gleichen Namen/Ids haben. Wenn sie gleich sind funktioniert es nur beim 1.Radiobutton.

Als Beispiel habe ich den Paketschein von Hermes genommen. Die Daten welche ich in die Felder setze, habe ich als Datas abgelegt. In einem echten Programm wird man diese sicher woanders herholen. Hauptsache die Daten sind in einem Feld mit der richtigen Reihenfolge.

Den AnmeldeButton habe ich disabled. Existiert nur um zu zeigen, das man auch Anmeldedaten einsetzen kann.

Was ich nicht geschafft habe, ist automatisch einen Button zu drücken. Es muß gehen, aber ich check die Sache mit dem "onclick Event" nicht.
Wer könnte da helfen ?

Nach dem Ausfüllen wird der Button -Paketschein drucken- auf der Webseite gedrückt, es wird gerechnet und Hermes ruft den AcrobateReader auf. Dieser wiederrum ruft den IE auf. Es kann sein, das es dabei zu einer Fehlermeldung kommt. Dann einfach solange drücken bis es klappt. Ist zumindest bei mir manchmal so. Liegt nicht am Code sondern ganz sicher am Zusammenspiel von Hermes und dem IE.

Und die wichtigste Frage, wo bekommt man die Feldnamen her. Einfach den Quellcode einer Webseite anzeigen lassen.
Beim IE: Ansicht/Quelltext. Bei Google Chrome: Aktulle Seite bearbeiten/Entwickler/Quelle anzeigen.

Dort Suchen nach z.B. <input type="text" name="empfaenger(NACHNAME)"
oder <input type="radio" value="1" alt="noImageReplacement" tabindex="56" id="mwStAusweis1"
oder <input class="prips" name="password" dir="ltr" id="pass" type="password"/>
Der Feldname ist entweder name= oder id=. Das muß man ausprobieren. Manchmal ist es auch egal.

Code: Alles auswählen

;Hermespaketschein ausfüllen HJBremer / Hroudtwolf
#urlHermes = "http://privatpaketservice.hlg.de/wps/portal/PRIPS_DEU/PAKETVERSAND"

Enumeration
 #main_window
 #web_gadget 
 #web_butEnd
 #web_but1
 #web_but2
EndEnumeration

#abstand  = 10
#buttonbr = 99
#buttonhh = 22
#infofeldhh = 50

;Hermes
#hermesmax = 10
Global Dim hermesadrfeld$(#hermesmax)
Global Dim hermesabsender$(#hermesmax)
Global Dim hermesempfaenger$(#hermesmax)

Procedure PrgResize()
  
  windowbr = WindowWidth(#main_window)
  windowhh = WindowHeight(#main_window)
    
  wbr = windowbr - #abstand - #abstand 
  whh = windowhh - #abstand - #abstand - #abstand - #infofeldhh  
  ResizeGadget(#web_gadget, #PB_Ignore, #PB_Ignore, wbr, whh) 
  
  bze = #abstand + #abstand + whh  
  bsp = #abstand   
  ResizeGadget(#web_but1, bsp, bze, #PB_Ignore, #PB_Ignore) 
  
  bsp + #abstand + #buttonbr
  ResizeGadget(#web_but2, bsp, bze, #PB_Ignore, #PB_Ignore) 

  bspEnd = windowbr - #abstand - #buttonbr
  ResizeGadget(#web_butEnd, bspEnd, bze, #PB_Ignore, #PB_Ignore) 

EndProcedure

Procedure WebGadgetInfo(info$, p=0)
  StatusBarText(0, p, info$)
EndProcedure
Procedure WebGadget_ScrollY(y)
  webscroll = y      
  SetGadgetAttribute(#web_gadget, #PB_Web_ScrollY, webscroll)
EndProcedure
Procedure WebgadgetBusy()
;warten bis fertig geladen 
While GetGadgetAttribute(#web_gadget, #PB_Web_Busy) 
      While WindowEvent(): Delay(1) : Wend 
Wend 
EndProcedure
Procedure WebgadgetLoad(url$)
  SetGadgetText(#web_gadget, url$) 
  WebgadgetInfo(url$)
  WebgadgetInfo("Bitte warten",1)
  WebgadgetBusy()
  WebgadgetInfo("",1)
  DisableGadget(#web_but2,0)
EndProcedure

Procedure WebgadgetInput ( sKey.s , text$="" , checked=0, flag=0 ) 
;von Hroudtwolf: http://purebasic-lounge.com/viewtopic.php?t=5986
   
   Protected WebBrowser    .IWebBrowser2 = GetWindowLongPtr_( GadgetID ( #web_gadget ) , #GWL_USERDATA ) 
   Protected Dispatch      .iDispatch 
   Protected Document      .IHTMLDocument3 
   Protected Element       .IHTMLElement 
   Protected InputElement  .IHTMLInputElement 
     
   If Not ( WebBrowser\get_Document( @ Dispatch ) = #S_OK ) 
      Dispatch\Release() 
      ProcedureReturn  
   EndIf 
   If Not ( Dispatch\QueryInterface( ? IID_IHTMLDocument3 , @ Document ) = #S_OK ) 
      Document\Release()    
      Dispatch\Release()    
      ProcedureReturn  
   EndIf 
   If Not ( Document\getElementById( sKey , @ Element ) = #S_OK And Element ) 
      Document\Release()    
      Dispatch\Release()    
      ProcedureReturn  
   EndIf 
   If Not ( Element\QueryInterface( ? IID_IHTMLInputElement , @ InputElement ) = #S_OK) 
      Element\Release()    
      Document\Release()    
      Dispatch\Release()    
      ProcedureReturn  
   EndIf 
     
    
   ;dieser kleine Teil ist von mir
   If flag = 0
       ;Text übergeben
       If Not ( InputElement\put_Value( text$ ) = #S_OK ) 
          Element\Release()    
          Document\Release()    
          Dispatch\Release()    
          ProcedureReturn 
       EndIf 
   ElseIf flag = 1
       ;Checkbox/Radiobutton, wenn Radiobuttons alle die gleiche ID, nur den 1. 
       If Not ( InputElement\put_checked( checked ) = #S_OK ) 
          Element\Release()                                   
          Document\Release()    
          Dispatch\Release()    
          ProcedureReturn 
       EndIf 
   EndIf       
       
   InputElement\Release()    
   Element\Release()    
   Document\Release()    
   Dispatch\Release()    

DataSection 
  IID_IHTMLDocument3:      ; { 3050F485-98B5-11CF-BB82-00AA00BDCE0B } 
  Data.l $3050F485 
  Data.w $98B5 , $11CF 
  Data.b $BB , $82 , $00 , $AA , $00 , $BD , $CE , $0B 
  IID_IHTMLInputElement:   ; { 3050f5d2-98b5-11cf-bb82-00aa00bdce0b } 
  Data.l $3050F5D2 
  Data.w $98B5 , $11CF 
  Data.b $BB , $82 , $00 , $AA , $00 , $BD , $CE , $0B 
EndDataSection 
    
EndProcedure 

Procedure HermesAnmeldung()

 key$ = "userid"
 txt$ = "HJBREMER"
 WebGadgetInput(key$, txt$)
 
 key$ = "password"
 txt$ = "blabla"
 WebGadgetInput(key$, txt$)

 WebgadgetInfo("Drücken Sie den Anmeldebutton auf der Webseite")
EndProcedure

Procedure HermesReadDaten()

Restore HermesAdrFeldname
For j = 1 To #hermesmax: Read.s hermesadrfeld$(j): Next 

Restore HermesAdrAbsender
For j = 1 To #hermesmax: Read.s hermesabsender$(j): Next 

Restore HermesAdrEmpfaenger
For j = 1 To #hermesmax: Read.s hermesempfaenger$(j): Next 

DataSection

HermesAdrFeldname:
Data.s "(NACHNAME)"
Data.s "(VORNAME)"
Data.s "(ADRESSZUSATZ)"
Data.s "(STRASSE)"
Data.s "(HAUSNUMMER)"
Data.s "(PLZ)"
Data.s "(ORT)"
Data.s "(VORWAHL)"
Data.s "(TELEFON)"
Data.s "(EMAIL)"

HermesAdrAbsender:
Data.s "Musterfrau"
Data.s "Ute"
Data.s ""
Data.s "Mühlenhof"
Data.s "1"
Data.s "24534"
Data.s "Neumünster"
Data.s "04321"
Data.s "00000"
Data.s "Mustermann@t-online.de"

HermesAdrEmpfaenger:
Data.s "Otto Mustermann"
Data.s ""
Data.s ""
Data.s "Bachstr.1"
Data.s ""
Data.s "45529"
Data.s "Hattingen"
Data.s ""
Data.s ""
Data.s ""

EndDataSection

EndProcedure

Procedure HermesSetDaten()

For j = 1 To #hermesmax
  
  key$ = "absender" + hermesadrfeld$(j)
  txt$ = hermesabsender$(j)
  WebGadgetInput(key$, txt$)

  key$ = "empfaenger" + hermesadrfeld$(j)
  txt$ = hermesempfaenger$(j)
  WebGadgetInput(key$, txt$)

Next 

;Paketart: paket(p1) = S / paket(p2) = M
key$ = "paket(p1)"  
txt$ = "1"
WebGadgetInput(key$, txt$)

;Checkboxen
flag = 1
key$ = "bestaetigungWertBox"
WebGadgetInput(key$, "", 1, flag)

key$ = "bestaetigungAgb"
WebGadgetInput(key$, "", 1, flag)

; key$ = "auktionsnummer"
; txt$ = "380123456789"
; WebGadgetInput(key$, txt$)

WebgadgetInfo("Drücken Sie den Button: --> Paketschein drucken")

EndProcedure

;---------------------------------------------------------------------------

flag = #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget
flag | #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget
hwnd = OpenWindow(#main_window, 0, 0, 900, 600, "Hermes", flag) 
       
       CreateStatusBar(0, WindowID(#main_window))
          AddStatusBarField(#PB_Ignore)
          AddStatusBarField(#PB_Ignore)
       
       WebGadget(#web_gadget, #abstand, #abstand, 0, 0, "")   
       ButtonGadget(#web_butEnd, 0, 0, #buttonbr, #buttonhh, "Ende")
              
       ButtonGadget(#web_but1, 0, 0, #buttonbr, #buttonhh, "anmelden")
       ButtonGadget(#web_but2, 0, 0, #buttonbr, #buttonhh, "ausfüllen")
       DisableGadget(#web_but1,1)
       DisableGadget(#web_but2,1)
       
       PrgResize()        
       WebgadgetLoad(#urlHermes)
              
Repeat 
    event = WaitWindowEvent()       
    Select event      
      Case #PB_Event_SizeWindow: PrgResize()
      Case #PB_Event_Gadget 
           Select EventGadget()                        
              Case #web_but1: HermesAnmeldung()
                   
              Case #web_but2
                   HermesReadDaten()       
                   HermesSetDaten()
                   WebGadget_ScrollY(99999)
                         
              Case #web_butEnd: event = #PB_Event_CloseWindow                         
           EndSelect   
    EndSelect
Until event = #PB_Event_CloseWindow 
End

Re: Webgadget Felder automatisch ausfüllen im Hermes Paketsc

Verfasst: 03.08.2010 16:29
von Tombi
Was ich nicht geschafft habe, ist automatisch einen Button zu drücken. Es muß gehen, aber ich check die Sache mit dem "onclick Event" nicht.
Wer könnte da helfen ?
Gibt es dafür inzwischen eine Lösung?

Re: Webgadget Felder automatisch ausfüllen im Hermes Paketsc

Verfasst: 04.08.2010 06:34
von dysti
...eine Lösung wäre toll. Ich gebrauche sehr viel diese Internetseite.

Re: Webgadget Felder automatisch ausfüllen im Hermes Paketsc

Verfasst: 25.10.2010 13:52
von Tombi
Das könnte ein Lösungsweg für mein Problem hier sein:
http://forums.purebasic.com/german/view ... =3&t=23397

Nur wie drücke ich den Button automatisch? /:->

Re: Webgadget Felder automatisch ausfüllen im Hermes Paketsc

Verfasst: 25.10.2010 19:36
von Rudi
hjbremer hat geschrieben:Was ich nicht geschafft habe, ist automatisch einen Button zu drücken. Es muß gehen, aber ich check die Sache mit dem "onclick Event" nicht.
Wenn da ein "onclick Event" im Button-Tag angegeben ist, mit welchem das Formular abgeschickt wird, zB. so:
onclick='javascript:document.form.submit()'
dann so aufrufen:

Code: Alles auswählen

SetGadgetText(#WebGadget, "javascript:document.f.submit()")
Habe hier ein einfaches Beispiel für Google.de gebastelt; Suchbegriff eingeben und auf den Button links oben klicken:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 600, 300, "WebGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  WebGadget(0, 10, 20, 580, 280, "http://www.google.de/")
  ButtonGadget(1,0,0,100,20,"Suchen")
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            SetGadgetText(0, "javascript:document.f.submit()")
        EndSelect
      Case #PB_Event_CloseWindow
        Select EventWindow()
          Case 0
            CloseWindow(0)
            Break
        EndSelect
    EndSelect
  ForEver
EndIf
"document" ist die Htmlseite, "f" das Formular und "submit()" schickt es ab.

Re: Webgadget Felder automatisch ausfüllen im Hermes Paketsc

Verfasst: 25.10.2010 22:05
von Rudi
@hjbremer
Habe mir jetzt Deinen speziellen Fall angesehen.
Füge in Deinem Code in der Buttonabfrage zwischen Zeile 266 und 267 folgende Zeile ein:

Code: Alles auswählen

SetGadgetText(#web_gadget, "javascript:submitSpeichern()")
Das ist das "onclick Event" welches beim Betätigen des "Paketschein drucken" - Buttons ausgelöst wird.
Übrigens, der Button hat auch eine ID: id="submitButton"

Re: Webgadget Felder automatisch ausfüllen im Hermes Paketsc

Verfasst: 25.10.2010 22:52
von hjbremer
vielen Dank für den Hinweis !!!

Re: Webgadget Felder automatisch ausfüllen im Hermes Paketsc

Verfasst: 03.11.2010 17:41
von Tombi
Entweder meine Eigenverschuldung oder die Prozedure ist nicht 100% threadsicher:
http://forums.purebasic.com/german/view ... =3&t=23449

Re: Webgadget Felder automatisch ausfüllen im Hermes Paketsc

Verfasst: 06.01.2011 21:42
von alter Mann
Ich habe eine andere Möglichkeit gefunden den "Click" auszuführen

Code: Alles auswählen

Procedure WebGadgetClick ( sKey.s )
   
  Protected WebBrowser    .IWebBrowser2 = GetWindowLongPtr_( GadgetID ( #web_gadget ) , #GWL_USERDATA )
  Protected Dispatch      .iDispatch
  Protected Document      .IHTMLDocument3
  Protected Element       .IHTMLElement
  Protected InputElement  .IHTMLInputElement
  Protected *Form         .IHTMLFormElement
  
  If Not ( WebBrowser\get_Document( @ Dispatch ) = #S_OK )
    Dispatch\Release()
    ProcedureReturn 
  EndIf
  If Not ( Dispatch\QueryInterface( ? IID_IHTMLDocument3 , @ Document ) = #S_OK )
    Document\Release()   
    Dispatch\Release()   
    ProcedureReturn 
  EndIf
  If Not ( Document\getElementById( sKey , @ Element ) = #S_OK And Element )
    Document\Release()   
    Dispatch\Release()   
    ProcedureReturn 
  EndIf
  
  Element\click()
  
  Element\Release()   
  Document\Release()   
  Dispatch\Release() 
EndProcedure

Re: Webgadget Felder automatisch ausfüllen im Hermes Paketsc

Verfasst: 06.01.2011 22:02
von hjbremer
vielen Dank für deine Mühe :allright: