Schön, daß es jemand brauchen kann
Kleines Update auf V0.2:
- ein paar Zeilen weniger
Schön, daß es jemand brauchen kann
Kleines Update auf V0.2:
- ein paar Zeilen weniger
Als ich am Schreiben meines Posts war, war deiner noch nicht gepostet. Somit hatte ich mich nicht auf deinen (völlig korrekten) Hinweis bezogen. Den Parameter Attach bei _IECreate hatte ich auch nicht bedacht.
Achso - hätte ich mir denken können, sollen, wenn ich auf die Zeit des Posts geachtet hätte
Guten Abend,
Liegt aber wahrscheinlich daran das es eine SSL-Seite ist, bei der ich mich zuerst einloggen muss und erst nach dem Login den eigentlich Wert auslesen will.Geht das überhaupt?
Was genau funktioniert denn nicht?
Ob das nun https, http, gopher oder sonst was ist, bleibt sich gleich, da die AutoIt-Operationen nur im Client erfolgen.
Statt: _IECreate() mußt du _IEAttach() verwenden.
Müßen mußt du nicht.
Wenn du bei _IECreate den besagten Parameter verwendest, dann wir ein offenes Browser verwendet, wenn keines offen ist geht eben eines auf.
Bei _IEAttach ist die Vorraussetzung, daß der Browser schon offen ist.
$oIE = _IEAttach("Internet Explorer")
_IENavigate($oIE, "http://www.autoitscript.com/")
oder eben:
$oIE = _IECreate ("www.autoitscript.com", 1)
[/autoit]Hallo,
Klick doch mal in deinem Programm hier auf _IECreate(), dann geht die Hilfe zu diesem Befehl auf und schau dir den Parameter "$f_tryAttach" an.
Grüße
Stilgar
Hallo,
So viel gibt es da auch nicht zu beschreiben:
1) Wie identifiziere ich die Buttons/Links die ich klicken möchte?
Anhand des HTML-Quelltextes am besten in Verbindung mit dem FF-AddOn FireBug.
Ohne dieses AddOn wird eine Automatisierung von Webseiten eh mühselig.
2) Wie trage ich die richtigen Daten in die richtigen Felder ein?
- die richtigen Felder wie unter 1) suchen
- unter Aktion "Set Value" auswählen
- den Cursor im FPA auf das passende Element setzen
- und Create Command auswählen
3) Wie bediene ich "Create Command" im Analyzer?
siehe 2)
4) und die Actions die ich irgendwie einstellen kann?
siehe 2)
Die Aktion muß zum Element passen - z.B. "Set Value" wird bei einem Link nichts bewirken.
steht doch eigentlich schon dort:
https://autoit.de/index.php?page=Thread&threadID=6637
oder?
Als weitere Hilfsfunktionen, zum Ausfüllen von Formularen, gibt es auch noch:
https://autoit.de/index.php?page=Thread&threadID=14452
https://autoit.de/index.php?page=Thread&threadID=14368
Grüße
Thorsten
So gehts:
Global $Firefox_connect
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]If _FirefoxConnect() Then
Global $sURL = _FirefoxCmd("window.content.document.location.href")
MsgBox(0, "", $sURL)
EndIf
; ==============================================================================
Func _FirefoxConnect()
Local $IP = "127.0.0.1"
Local $iPort = 4242
TCPStartup()
[/autoit] [autoit][/autoit] [autoit]$Firefox_connect = TCPConnect($IP, $iPort)
[/autoit] [autoit][/autoit] [autoit]If $Firefox_connect <> -1 Then
If _FirefoxWait() Then
Return 1
Else
Return 0
EndIf
Else
TCPShutdown()
EndIf
EndFunc ;==>_FirefoxConnect
; ==============================================================================
Func _FirefoxCmd($Firefox_command)
_FirefoxSend($Firefox_command)
Return _FirefoxRecv()
EndFunc ;==>_FirefoxCmd
; ==============================================================================
Func _FirefoxSend($sCommand)
TCPSend($Firefox_connect, $sCommand & @CRLF)
EndFunc ;==>_FirefoxSend
; ==============================================================================
Func _FirefoxWait()
Local $sReturn = '', $recv
[/autoit] [autoit][/autoit] [autoit]Local $TimeOutTimer = TimerInit()
While TimerDiff($TimeOutTimer) < 5000
$recv = TCPRecv($Firefox_connect, 4096)
ConsoleWrite($recv)
If @error Then ExitLoop
$sReturn &= $recv
If StringRegExp($recv, "!!!(.*?)(TypeError|Exception|ReferenceError):?") Then
$recv = StringLeft($recv, StringInStr($recv, "location") - 1)
SetError(1)
Return ""
ElseIf StringInStr($recv, "....>") Then
_FirefoxSend(";") ; MozRepl-Reset
Sleep(100)
SetError(2)
Return ""
ElseIf StringInStr($recv, "beginning of the line to force evaluation") Then
Sleep(500) ; first connection delay
EndIf
If StringRegExp($recv, "repl[\d]?>") Then Return StringRegExpReplace($sReturn, "repl[\d]?>", "")
[/autoit] [autoit][/autoit] [autoit]WEnd
[/autoit] [autoit][/autoit] [autoit]Return ''
EndFunc ;==>_FirefoxWait
; ==============================================================================
Func _FirefoxRecv()
Local $sRet = _FirefoxWait()
$sRet = StringStripWS($sRet, 3) ; Leerzeichen entfernen
; Anführungszeichen am Anfang und Ende entfernen
If StringLeft($sRet, 1) = '"' Then $sRet = StringTrimLeft($sRet, 1)
If StringRight($sRet, 1) = '"' Then $sRet = StringTrimRight($sRet, 1)
Return $sRet
EndFunc ;==>_FirefoxRecv
Die While Schleife kannst du weglassen, entweder die Verbindung wird aufgebaut oder nicht.
Die Kommunikation und die eigentliche "Bedienung" von FF sind zwei vollkommen verschiedene Sachen.
Die Bedienung erfolgt rein über das Senden von JavaScript-Befehlen und die Kommunkation ist reines Telnet.
Also eins nach dem anderen
Schau dir mal das dort an:
FF-Management - FireFox.au3
das ein einfaches Telnet Programm, mit dem du direkt z.B. auf MozRepl zugreifen kannst, vielleicht wird die Kommunaktion damit klarer.
Das ganze Drumherum bei __FFWaitForRepl usw. ist nötig um die empfangenen Daten auszuwerten.
Wenn das alles funktioniert, kommen die eigentlichen Funktionen, wobei bei denen meistens 90% der Funktion aus einer Auwertung der Übergabeparameter besteht.
Was dann eigentlich an FF gesendet wird, kannst du (größtenteils zumindest) mit der neuen Testversion ausprobieren:
Neue Funktionen und ToDo-List
damit lassen sich die Befehle aufzeichnen die gesendet werden.
Aus einem:
[autoit]_FFSetValueByName("fname", "Vorname")
[/autoit]
wird dann im Endeffekt:
_FFCmd(".getElementsByName('fname')[0].value='Vorname';")
[/autoit]Wo kommt denn die Funktion "_FFWaitForRepl" her?
Du rufst die zwar auf, die ist aber nicht vorhanden.
Aus der Schleife:
[autoit]While 1
$Firefox_connect = TCPConnect($IP, $iPort)
WENd
Kommt das Programm nie wieder heraus.
Wenn du was gesendet hast, dann mußt du auch die Antwort von MozRepl auch abholen
"window.content.wrappedJSObject.document" ist nicht bei jeder Art von Befehl richtig.
Auf Frames bekommst du mit diesem Aufbau der Funktionen auch keinen Zugriff.
Wenn einen falschen JavaScript-Befehl abschickst, bringt MozRepl auch einen Fehler, den du wieder zurücksetzen muß, sonst geht gar nichts mehr, oder schickst eben ein try/catch mit.
Und vor allem - warum möchtest du die ganzen Funktionen denn neu bauen?
Ohne der FF.au3? Bist du dir sicher?
Voraussetzungen:
* Erst mal die Anleitung zu MozRepl durchlesen
* HTML/JavaScript/DOM im Schlaf beherrschen
* XPath wäre auch nicht schlecht
* den Inhalt des MDN halbwegs überblicken: https://developer.mozilla.org/En
* die Sachen die dort nicht (offensichtlich) stehen, bekommt man aber auch durch das Zerlegen des Browser-Source-Codes heraus
Dann per AutoIt:
1 per TCP eine Verbindung zu MozRepl aufbauen
2 auf Antwort warten
3 Antwort auswerten
4 evtl. Fehler abfangen
5 Befehle in Form von JavaScript senden, dabei evtl. Wrapper für sicherheitkritische Sachen beachten
6 GOTO 2
evtl. dort die ersten Versuche ansehen:
FF-Management - FireFox.au3
FF-Management - FireFox.au3
Wie? Schau dir halt die UDF an
Oder Kurzversion:
Die FF.au3 arbeitet über eine Telnet-Schnittstelle in FF die durch das AddOn MozRepl realisiert ist und ermöglicht darüber den Zugriff auf gesamten Browser, nicht nur auf die dargestellte Seite.
Och das war doch nicht bös gemeint
Und auch nur allgemein so dahin gestellt.
@OP:
Du wolltest sicher auch ne wirkliche Antwort ...
Mit der FF.au3 würde das so aussehen:
[autoit]
#include <FF.au3>
_FFConnect()
$sURL = _FFCmd(".location.href")
alles weitere dazu dort:
https://autoit.de/index.php?page=Board&boardID=32
Die nun einfachste Form mit FF ein Formular auszufüllen:
_FF_RecordForm()
Vorgehensweise:
* Das Formular im Browser ausfüllen
* Cursor im Formular stehen lassen ! Wichtig daran erkennt die Funktion das Formular!
* Die Funktion ausführen und bekommt als Rückgabe ein Script für die FF.au3, das das Formular genau so wiederausfüllt.
Die Funktion:
; #FUNCTION# ===================================================================
; Name ..........: _FF_RecordForm
; Description ...:
; AutoIt Version : V3.3.0.0
; Requirement(s).: FF.au3 / MozRepl
; Syntax ........: _FF_RecordForm()
; Parameter(s): .: -
; Return Value ..: Success - FF.au3 functions to fill the form
; Failure - empty string
; Author(s) .....: Thorsten Willert
; Date ..........: Thu Nov 05 13:43:14 CET 2009
; Version .......: 0.3
; ==============================================================================
Func _FF_RecordForm()
Local $sScript = ""
Local $sCmd, $tmp, $iElements, $sType
_FFCmd("FFau3.tmp=window.content.document.activeElement;")
For $i = 0 To _FFGetLength("form") -1
$iElements = _FFFormGetElementsLength($i) - 1
For $j = 0 To $iElements
If _FFCmd("FFau3.tmp==window.content.document.forms[" & $i & "].elements[" & $j & "] ? 1 : 0") = 1 Then ExitLoop
Next
ExitLoop
Next
For $j = 0 To $iElements
$sType = _FFCmd(".forms[" & $i & "].elements[" & $j & "].type")
Switch $sType
Case "textarea","text","password"
$sCmd = StringFormat(".forms[%i].elements[%i].value", $i, $j)
$tmp = _FFCmd($sCmd)
$sScript &= '_FFCmd("' & $sCmd & "='" & __FFValue2JavaScript($tmp) & "'"")" & @CRLF
Case "radio","checkbox"
$sCmd = StringFormat(".forms[%i].elements[%i].checked", $i, $j)
$tmp = _FFCmd($sCmd)
$sScript &= '_FFCmd("' & $sCmd & '=' & __FFB2S($tmp) & '")' & @CRLF
Case "select-one"
$sCmd = StringFormat(".forms[%i].elements[%i].selectedIndex", $i, $j)
$tmp = _FFCmd($sCmd)
$sScript &= '_FFCmd("' & $sCmd & '=' & $tmp & '")' & @CRLF
EndSwitch
Next
Return $sScript
EndFunc ;==>_FF_RecordForm
bitte mal ausgiebig testen
Hallo,
nach den 2ms dürfte irgendwann ein TimeOut kommen.
Das sieht danach aus, daß die Verbindung nicht aufgebaut werden konnte. Wird der Port irgendwie blockiert?
Kannst du z.B. mit Putty eine Verbindung zu MozRepl herstellen?
Läuft FireFox auf Mac oder Win Seite? - Wäre ja theoretisch möglich
Grüße
Stilgar
Anregungen:
Es geht auf Seiten nicht, bei denen zwischen dem Password und dem Feld für den Benutzernamen noch irgendein anderer Input liegt. (CheckBox für Cookie ...)
Darum habe ich bei der Funktion für FF eine zweite Schleife drin, die rückwärts vom Password-Feld weg einen Text-Input sucht und diesen ausfüllt.
(war in der ersten Version nicht drin)
Im englischen AutoItScript-Forum klappts auch nicht. Ist wieder eine dieser typischen Web2.murks Seiten bei denen unzählige Sachen hidden sind, im Endeffekt sind es dort 6 Formulare, von denen das zweite zum Einloggen ist - deswegen dieser komische FormOffset Parameter bei der FF Version.
Wobei mir dort auch nicht ganz klar warum es nicht geht, schließlich ist im ersten Formular kein Passwort-Input.
Auf anderen Seiten sieht es funktionierend aus.
[EDIT]
Habe dir mal eine PM mit Seiten geschickt wo es geht und nicht (ca. 50/50). Wo es nicht geht liegt es meistens an dem oben erwähnten Problem mit dem Text-Input.
V0.5.3.9b-1
Einen "Recorder" eingebaut, mit fünf winzigen Funktionen:
* _FFRecordStart( $sName = ''" ) - Startet die Aufnahme der Funktionen, wird $sName angegeben wird eine Funktion generiert
* _FFRecordStop() - beeendet die Aufnahme und schließt evtl. die Funktion ab
* _FFRecordOn() / _FFRecordOff() - zum Pausieren der Aufnahme
* _FFRecordGet() - gibt die "Aufnahme" als String zurück
* _FFRecordAppend($sString) - hängt einen Ausdruck an die aktuelle Aufnahme
Sinn des Ganzen:
Aufnahme der wichtigsten Funktionen von Programmen, damit daraus ein optimiertes Programm erzeugt werden kann, vor allem bei Programmen die zuerst viele Informationen auf einer Seite suchen müßen um dann im Endeffekt nur ein Feld auszufüllen.
Einfaches Beispiel:
#include <FF.au3>
[/autoit] [autoit][/autoit] [autoit]_FFConnect()
[/autoit] [autoit][/autoit] [autoit]_FFRecordStart()
[/autoit] [autoit][/autoit] [autoit]_FFOpenURL("http://ff-au3-example.thorsten-willert.de/")
[/autoit] [autoit][/autoit] [autoit]_FFLinkClick("mozlab")
Sleep(3000)
_FFRecordAppend("Sleep(3000)")
_FFAction("back")
_FFSetValueByName("fname", "Vorname")
_FFSetValueByName("lname", "Vorname")
_FFRecordStop()
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite( _FFRecordGet() )
[/autoit]
Ergibt folgenden Code:
_FFCmd(".location.href='http://ff-au3-example.thorsten-willert.de/';")
_FFLoadWait(0, 20000)
_FFCmd("FFau3.simulateClick(window.content.document.links[2],0,0);")
_FFLoadWait(0, 20000)
Sleep(3000
_FFCmd("gBrowser.goBack()")
_FFLoadWait(0, 20000)
_FFCmd(".getElementsByName('fname')[0].value='Vorname';")
_FFCmd(".getElementsByName('lname')[0].value='Vorname';")
es sind noch nicht alle Funktionen dafür ausgelegt, d.h. manchmal sind einige überflüssige Programmzeilen dabei (nein bei dem Beispiel paßt alles )
Viel Spaß damit!
Die IE.au3 arbeitet rein mit der form-methode submit()
Seltsamerweise klappt das nicht immer.
Bei der FF.au3 gibt es deswegen dafür verschiedene Methoden:
- submit()
- ein simuliertes "enter" in dem Formular mit keydown oder keypress
- ein click auf den Submit-Button
[EDIT]
Der Grund warum submit() nicht immer funktioniert ist, daß auf manchen so Frickel-Seiten der Button für submit auch die ID oder den Namen "submit" hat, dies scheint die Methode zu überschreiben und schon geht submit() nicht mehr.