Webgadget-Problem

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Webgadget-Problem

Beitrag von alter Mann »

Ich möchte Daten aus einem Webgadget laden und muss dazu ein Formular ausfüllen.
Folgender Code funktioniert und ich erhalte die gewünschte Webseite, muss dazu aber
alle 3 Button anklicken

Code: Alles auswählen

EnableExplicit

Enumeration
  #MAIN_WINDOW
  #STATUS_BAR
  #WEB_GADGET
  #WEB_BUT_END
  #WEB_BUT1
  #WEB_BUT2
  #WEB_BUT3
  #DATEI_NR
EndEnumeration

#ABSTAND  = 10
#BUTTONBR = 99
#BUTTONHH = 22
#INFOFELDHH = 50

Procedure PrgResize()
 
  Protected iWindowbr.i = WindowWidth(#MAIN_WINDOW)
  Protected iWindowhh.i = WindowHeight(#MAIN_WINDOW)
  Protected iWbr = iWindowbr - #ABSTAND - #ABSTAND
  Protected iWhh = iWindowhh - #ABSTAND - #ABSTAND - #ABSTAND - #INFOFELDHH 
  Protected iBze = #ABSTAND + #ABSTAND + iWhh 
  Protected iBsp = #ABSTAND   
  
  ResizeGadget(#WEB_GADGET, #PB_Ignore, #PB_Ignore, iWbr, iWhh)
 
  ResizeGadget(#WEB_BUT1, iBsp, iBze, #PB_Ignore, #PB_Ignore)
 
  iBsp + #ABSTAND + #BUTTONBR
  ResizeGadget(#WEB_BUT2, iBsp, iBze, #PB_Ignore, #PB_Ignore)

  iBsp + #ABSTAND + #BUTTONBR
  ResizeGadget(#WEB_BUT3, iBsp, iBze, #PB_Ignore, #PB_Ignore)

  ResizeGadget(#WEB_BUT_END, iWindowbr - #ABSTAND - #BUTTONBR, iBze, #PB_Ignore, #PB_Ignore)

EndProcedure

Procedure WebgadgetBusy()
  ;warten bis fertig geladen
  While GetGadgetAttribute(#WEB_GADGET, #PB_Web_Busy)
    While WindowEvent(): Delay(1) : Wend
  Wend
EndProcedure

Procedure WebgadgetLoad(zUrl.s)
  SetGadgetText(#WEB_GADGET, zUrl)
  StatusBarText(#STATUS_BAR, 0, zUrl)
  StatusBarText(#STATUS_BAR, 1, "Bitte warten")
  WebgadgetBusy()
  StatusBarText(#STATUS_BAR, 1,"")
  DisableGadget(#WEB_BUT2,0)
EndProcedure

Procedure WebgadgetInput ( zKey.s , zText.s="" , iChecked.i=0, iFlag.i=0 )
;von Hroudtwolf: http://purebasic-lounge.com/viewtopic.php?t=5986
   
  Protected sWebBrowser    .IWebBrowser2 = GetWindowLongPtr_( GadgetID ( #web_gadget ) , #GWL_USERDATA )
  Protected sDispatch      .iDispatch
  Protected sDocument      .IHTMLDocument3
  Protected sElement       .IHTMLElement
  Protected sInputElement  .IHTMLInputElement
  
  If Not ( sWebBrowser\get_Document( @sDispatch ) = #S_OK )
    sDispatch\Release()
    ProcedureReturn 
  EndIf
  If Not ( sDispatch\QueryInterface( ? IID_IHTMLDocument3 , @sDocument ) = #S_OK )
    sDocument\Release()   
    sDispatch\Release()   
    ProcedureReturn 
  EndIf
  If Not (sDocument\getElementById( zKey , @sElement ) = #S_OK And sElement )
    sDocument\Release()   
    sDispatch\Release()   
    ProcedureReturn 
  EndIf
  If Not ( sElement\QueryInterface( ? IID_IHTMLInputElement , @sInputElement ) = #S_OK)
    sElement\Release()   
    sDocument\Release()   
    sDispatch\Release()   
    ProcedureReturn 
  EndIf
     
   
  ;dieser kleine Teil ist von mir
  If iFlag = 0
    ;Text übergeben
    If Not (sInputElement\put_Value( zText ) = #S_OK )
      sElement\Release()   
      sDocument\Release()   
      sDispatch\Release()   
      ProcedureReturn
    EndIf
  ElseIf iFlag = 1
    ;Checkbox/Radiobutton, wenn Radiobuttons alle die gleiche ID, nur den 1.
    If Not (sInputElement\put_checked( iChecked ) = #S_OK )
      sElement\Release()                                   
      sDocument\Release()   
      sDispatch\Release()   
      ProcedureReturn
    EndIf
  EndIf
     
  sInputElement\Release()   
  sElement\Release()   
  sDocument\Release()   
  sDispatch\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 WebGadgetSubmit ( zKey.s )
;von Hroudtwolf: http://purebasic-lounge.com/viewtopic.php?t=5986
   
  Protected sWebBrowser    .IWebBrowser2 = GetWindowLongPtr_( GadgetID ( #WEB_GADGET ) , #GWL_USERDATA )
  Protected sDispatch      .iDispatch
  Protected sDocument      .IHTMLDocument3
  Protected sElement       .IHTMLElement
  ;Protected sInputElement  .IHTMLInputElement
  ;Protected *sForm         .IHTMLFormElement
  
  If Not ( sWebBrowser\get_Document( @sDispatch ) = #S_OK )
    sDispatch\Release()
    ProcedureReturn 
  EndIf
  If Not (sDispatch\QueryInterface( ? IID_IHTMLDocument3 , @sDocument ) = #S_OK )
    sDocument\Release()   
    sDispatch\Release()   
    ProcedureReturn 
  EndIf
  If Not (sDocument\getElementById( zKey , @sElement ) = #S_OK And sElement )
    sDocument\Release()   
    sDispatch\Release()   
    ProcedureReturn 
  EndIf
  
  sElement\click()
  sElement\Release() 
  
  sDocument\Release()   
  sDispatch\Release() 
  ;sWebBrowser\Refresh()
  ;sWebBrowser\ExecWB(21,2,0,0)
  
EndProcedure
  
Procedure Anmeldung()

  Protected sKey.s = "_firstnameTextBox"
  Protected sTxt.s = "Nele"
  WebGadgetInput(sKey, sTxt)
  
  sKey = "_lastnameTextBox"
  sTxt = "Klein"
  WebGadgetInput(sKey, sTxt)
  
  ;sKey = "_regidTextBox"
  ;sTxt = "178853"
  ;WebGadgetInput(sKey, sTxt)
  
  StatusBarText(#STATUS_BAR, 0, "Drücken Sie den Anmeldebutton auf der Webseite")
EndProcedure

Procedure WinCB(iWnd.i,iMsg.i,iwParam.i,ilParam.i)
  Protected iResult = #PB_ProcessPureBasicEvents
  ;
  ; Ihr Programmcode hier
  ;
  ProcedureReturn iResult
  
EndProcedure

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

Procedure Main()

  Protected iFlag = #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget
  Protected iWnd = OpenWindow(#MAIN_WINDOW, 0, 0, 900, 600, "Hermes", iFlag)
  Protected iEvent.i, iF1.i, iF2.i
  Protected zText.s
       
  CreateStatusBar(#STATUS_BAR, WindowID(#MAIN_WINDOW))
    AddStatusBarField(#PB_Ignore)
    AddStatusBarField(#PB_Ignore)
       
  WebGadget(#WEB_GADGET, #ABSTAND, #ABSTAND, 0, 0, "")   
  ButtonGadget(#WEB_BUT_END, 0, 0, #BUTTONBR, #BUTTONHH, "Ende")
       
  ButtonGadget(#WEB_BUT1, 0, 0, #BUTTONBR, #BUTTONHH, "1.")
  ButtonGadget(#WEB_BUT2, 0, 0, #BUTTONBR, #BUTTONHH, "2.")
  ButtonGadget(#WEB_BUT3, 0, 0, #BUTTONBR, #BUTTONHH, "3.")
  
  PrgResize()       
  WebgadgetLoad("http://77.236.98.18/Modules/Results/Individual.aspx?Lang=de-DE")             
  
  OpenFile(#DATEI_NR,GetTemporaryDirectory()+"Text.htm")
  WriteString(#DATEI_NR,GetGadgetItemText(#WEB_GADGET,#PB_Web_HtmlCode))
  CloseFile(#DATEI_NR)
  
  SetWindowCallback(@WinCB())
       
  Repeat
    iEvent = WaitWindowEvent()       
    Select iEvent     
      Case #PB_Event_SizeWindow
        PrgResize()
      Case #PB_Event_Gadget
        Select EventGadget()                       
          Case #WEB_BUT1: 
            Anmeldung()
            WebGadgetSubmit ( "_submitButton" )
            zText.s = GetGadgetText(#WEB_GADGET)
            StatusBarText(#STATUS_BAR, 0, zText)
            
          Case #WEB_BUT2
            WebGadgetSubmit ( "_bestHyperLink" )
            
            OpenFile(#DATEI_NR,GetTemporaryDirectory()+"Text.htm")
            WriteString(#DATEI_NR,GetGadgetItemText(#WEB_GADGET,#PB_Web_HtmlCode))
            CloseFile(#DATEI_NR)
            
            zText.s = GetGadgetText(#WEB_GADGET)
            StatusBarText(#STATUS_BAR, 0, zText)
            
          Case #WEB_BUT3
            OpenFile(#DATEI_NR,GetTemporaryDirectory()+"Text.htm")
            WriteString(#DATEI_NR,GetGadgetItemText(#WEB_GADGET,#PB_Web_HtmlCode))
            CloseFile(#DATEI_NR)
            
          Case #WEB_BUT_END: iEvent = #PB_Event_CloseWindow                         
        EndSelect   
    EndSelect
  Until iEvent = #PB_Event_CloseWindow
  End
EndProcedure

Main()
Nun möchte ich das im Hintergrund machen, ohne Interaktion.
Hat jemand eine Idee, wie man das realisiert ?

Wenn ich

Code: Alles auswählen

 Case #WEB_BUT2
und

Code: Alles auswählen

 Case #WEB_BUT3
kommentiere, wir die gewünschte Seite nicht geladen.
Win11 64Bit / PB 6.0
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Webgadget-Problem

Beitrag von Kiffi »

Du musst dem Browser auch die Zeit geben, die Seite fertig zu laden.

Also anstelle von #WEB_BUT2 und #WEB_BUT3 sowas wie das hier:

Code: Alles auswählen

Repeat

	If GetGadgetAttribute(#WEB_GADGET, #PB_Web_Busy)=0
		Break
	EndIf

	While WindowEvent() : Delay(10) : Wend

ForEver
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Webgadget-Problem

Beitrag von alter Mann »

der Hinweis war schon richtig :allright:
allerdings musste ich folgendes einfügen :

Code: Alles auswählen

        Select EventGadget()                       
          Case #WEB_BUT1: 
            Anmeldung()
            WebGadgetSubmit ( "_submitButton" )
            zText.s = GetGadgetText(#WEB_GADGET)
            StatusBarText(#STATUS_BAR, 0, zText)
            ;WebgadgetBusy()            
            iF1 = ElapsedMilliseconds()
            
            While ElapsedMilliseconds() - iF1 < 1000
              WindowEvent(): Delay(10)
            Wend
          ;Case #WEB_BUT2
            WebGadgetSubmit ( "_bestHyperLink" )
            
            OpenFile(#DATEI_NR,GetTemporaryDirectory()+"Text.htm")
            WriteString(#DATEI_NR,GetGadgetItemText(#WEB_GADGET,#PB_Web_HtmlCode))
            CloseFile(#DATEI_NR)
            
            zText.s = GetGadgetText(#WEB_GADGET)
            StatusBarText(#STATUS_BAR, 0, zText)
            ;WebgadgetBusy()
            
            iF1 = ElapsedMilliseconds()
            
            While ElapsedMilliseconds() - iF1 < 1000
              WindowEvent(): Delay(10)
            Wend
          ;Case #WEB_BUT3
            OpenFile(#DATEI_NR,GetTemporaryDirectory()+"Text.htm")
            WriteString(#DATEI_NR,GetGadgetItemText(#WEB_GADGET,#PB_Web_HtmlCode))
            CloseFile(#DATEI_NR)
            
          Case #WEB_BUT_END: iEvent = #PB_Event_CloseWindow                         
        EndSelect   
GetGadgetAttribute(#WEB_GADGET, #PB_Web_Busy) scheint nicht lange genug zu "warten" :(
Win11 64Bit / PB 6.0
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Webgadget-Problem

Beitrag von Kiffi »

alter Mann hat geschrieben:GetGadgetAttribute(#WEB_GADGET, #PB_Web_Busy) scheint nicht lange genug zu "warten" :(
bei mir hat's gestern geklappt. Aber wenn's so bei
Dir läuft, dann ist es ja auch OK :-)

Grüße ... Kiffi
a²+b²=mc²
Antworten