wd_loadwait scheint tatsächlich manchmal nicht auszureichen. Da gebe ich dann noch ein Sleep(3000) dazu. Ausprobieren!
Beiträge von HansJ54
-
-
Wie wäre es mit Angabe einer URL in NewTab?
_WD_NewTab($sSession, True, -1, $sURL)
Und bei Switch musst Du Dir vorher ein Hendl kaufen
$sHandle = _WD_Window($sSessions, "window")
Damit kannst Du das Fenster dann wieder reaktivieren.
-
-
"_FuncName($sFuncName, @ScriptLineNumber)" ist eine eigene Debug-Funktion, habe ich vergessen zu löschen - einfach weg damit.
$sChromeProfil und $sWebDriverFileChrome musst Du selbst setzen:
z.B.
$sChromeProfil = "C:/Webdriver/CHROME_WD_Profile"
$sWebDriverFileChrome = @ScriptDir & "chromedriver.exe"
Zeile 3+4 gehören nicht in ChromeSetup, das solltest Du an den Anfang Deines Programms setzen.
-
Das Problem liegt woanders:
ich habe im Prinzip die Passwortverwaltung der Browser optimiert nachgebildet und ein paar "kleine" Sicherheitsaspekte hinzugefügt. Google, Microsoft und KeyPass haben dadurch keinen Zugriff auf unsere gespeicherten Passwörter und außerdem liegen bei unseren Mitarbeitern keine Listen mit fast 100 Zugangsdaten auf dem Schreibtisch.
Funktioniert inzwischen bestens. (Anmerkung für die Vorsichtigen, da ich deswegen an anderer Stelle schon mal angegangen wurde: ich knacke keine Passwörter, sondern automatisiere die Anmeldungen mit hier hinterlegten Passwörtern - so wie die Browser oder KeyPass, nur aus meiner Sicht ein wenig komfortabler und sicherer).
Wenn jetzt in einer Mail ein Link geschickt wird, der über eine Anmeldeseite läuft, fehlt mir die Kontrolle und der Mitarbeiter kommt nicht weiter (da niemand hier irgendwelche Anmeldedaten kennt). Es geht also nicht um die Mail an sich oder bestimmte Mails, sondern nur um spezielle Links in manchen Mails. Es wird sicher eine Stelle geben, vermutlich in der Registry, wo für Outlook hinterlegt wird, was beim Klick auf einen Link ausgeführt wird - habe ich nur noch nicht gefunden.
-
Zusätzlich habe ich noch ein Fallback Script laufen welche alle Rechner welche mit dem Status an in der DB stehen periodisch anpingt. Dies hat den Grund, damit Rechner welche warum auch immer nicht normal heruntergefahren werden auch als offline erkannt werden.
Da hast Du Recht, aber unter Berücksichtigung der "Abstürze" kann man dann doch wieder ausschließlich mit Ping arbeiten!? Letzte Woche hat meine USV (!) plötzlich ohne Stromausfall meinem Rechner den Strom abgedreht, da hätte kein Abmeldescript geholfen.
-
Obwohl ich in den Chrome Einstellungen fest eingestellt habe, dass Benachrichtigungen Blockieren soll speichert er diese Einstellung nicht wenn ich mein Autoit-Programm neu starte und Chrome wieder geöffnet wird... dann kommt wieder die Meldung "Benachrichtigungen anzeigen Zulassen Blockieren" kann man das dauerhaft abstellen?
Wenn immer ein neues temporäres Profil genutzt wird, dann kann sich Chrome natürlich nichts merken. Das lässt sich dadurch verhindern, dass der Browser immer das gleiche vorgegebene Profil nimmt. Das erreicht man durch "$sChromeProfil" (Pfad zur Ablage des Profils z.B. c:\webdriver). Macht zwar auch wieder neue Baustellen auf, wenn Browserfenster offen bleiben und Du Dein Programm neu startest, aber hilft ansonsten. Falls das vorkommt, einfach alle Fenster schließen bevor Du neu startest oder mehrere solcher Profile vorsehen.
AutoIt
Alles anzeigenLocal Const $sChromeProfil = 'C:/Webdriver/CHROME_WD_Profile' Local Const $sWebDriverFileChrome = 'C:/Webdriver/chromedriver.exe' ... Func _SetupChrome() Local $sFuncName = "SetupChrome" _FuncName($sFuncName, @ScriptLineNumber) _WD_Option('Driver', $sWebDriverFileChrome) _WD_Option('Port', 9715) _WD_Option('DriverParams', '--log-path="' & $sLogsPath & 'chrome.log"' & ' --port=9715') $sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"goog:chromeOptions": {"w3c": true, "args":["user-data-dir=' & $sChromeProfil & '"]}}}}' EndFunc
Ansonsten scheint es mir bis jetzt doch recht einfach zu sein...
Bis jetzt ja, aber es bleiben, wenn Du tiefer einsteigst, immer noch Probleme. Wie bekommt man z.B. das "Chrome wird von automatisierter Testsoftware gesteuert" weg? Niemand hat einen Tipp bisher. Wobei das doch eigentlich mit "normalen Bordmitteln" von AutoIt möglich sein müsste ohne die Webdriver-UDF. Ist ja "nur ein Klick" auf das X
Ach und fast vergessen.... wie kann man eine Seite in einem Neuen Tab öffnen? Also keinen neuen Browser sondern nur einen neuen Tab....
Dazu gibt es den Befehl WD_NewTab, findest Du in WD_Helper.
Spoiler anzeigen
; #FUNCTION# ====================================================================================================================
; Name ..........: _WD_NewTab
; Description ...: Helper function to create new tab using Javascript
; Syntax ........: _WD_NewTab($sSession[, $lSwitch = Default[, $iTimeout = Default[, $sURL = Default[, $sFeatures = Default]]]])
; Parameters ....: $sSession - Session ID from _WDCreateSession
; $lSwitch - [optional] Switch session context to new tab? Default is True.
; $iTimeout - [optional] Period of time to wait before exiting function
; $sURL - [optional] URL to be loaded in new tab
; $sFeatures - [optional] Comma-separated list of requested features of the new tab
Evtl solltest du dir einmal deine Themen der letzten vier Jahre anschauen. Da hast mehrmals exakt das gleiche Thema gefragt. Sprich wie den Quellcode einer Webseite auslesen kannst.
Vielleicht ist es gar nicht schlecht, das Thema Webdriver UDF mal von "Fast-Anfänger" zu "Anfänger" zu vermitteln. Die WD_Demo von Dan ist zwar super, aber nichts für jemanden, der sich völlig neu in das Gebiet einarbeitet, sondern setzt schon einiges an Wissen und Intuition voraus - war zumindest bei mir so. Und es hat viel Zeit und Fragen gekostet, um auch nur die wichtigsten Hintergründe zu verstehen und damit umzugehen.
-
Neues Problem:
kann man den Klick auf Links in Mails in Outlook abfangen und anhand der URL entscheiden, ob AutoIt eigene Funktionen ausführt oder alternativ den Standardbrowser aufruft?
Beispiel:
Link in Mail = https://www1.wdr.de/wetter/wettervorhersage => Standardbrowser öffnet https://wdr.de
Link in Mail = https://allianz.de/newsletter => AutoIt startet mein Programm (da "allianz.de" enthalten)
-
Dachte ich mir
Rechte Maustaste auf das Feld, "Untersuchen" oder "Inspizieren", rechts erscheint ein markierter Text, rechte Maustaste auf den Text, Kopieren, "XPath kopieren" oder "Ganzen XPath kopieren". Der erste reicht meistens.
Manchmal, je nach Seite, muss man rechts oben links noch mal auf das Kästchen mit dem Pfeil klicken und dann mit der Maus dahin zeigen, wo man den XPath sucht.
-
Kleine Demo, ohne Fehlermeldungen usw. Die Suche nach dem Treffer-Link funktioniert bei diesem Beispiel zufällig, bei anderen nicht. Aber die Source solltest Du sowieso selbst analysieren und weiter verarbeiten, die Demo ist nur der Weg dorthin
AutoIt: WD_GoogleDemo.au3
Alles anzeigen#include "wd_core.au3" #include "wd_helper.au3" #include <MsgBoxConstants.au3> #cs Kurze Webdriver UDF - Demo Google starten Suchbegriff eintragen Submit :::: quick and dirty, ohne Fehleranzeige usw. #ce ; Webdriver Debug-Fenster $_WD_DEBUG = False Local $sDesiredCapabilities, $sSession, $sSource, $sLink1 Local $iIndex1, $iIndex2 ; Url Local $sUrl = 'https:\\www.google.de' ; XPath zum Suchfeld Local $sXPathGoogleSuche = '//*[@id="tsf"]/div[2]/div[1]/div[1]/div/div[2]/input' ; XPath zum Submit-Button Local $sXPathSubmit = '//*[@id="tsf"]/div[2]/div[1]/div[2]/div[2]/div[2]/center/input[1]' ; Suchbegriff Local $sSuche = 'Kreuzstich-Kreativität' ; Initialisierung ChromeDriver _SetupChrome() ; Launch the designated web driver console app _WD_Startup() ; Request new session from web driver $sSession = _WD_CreateSession($sDesiredCapabilities) ; Navigate to the designated URL _WD_Navigate($sSession,$sUrl) ; Wait for a browser page load to complete before returning _WD_Loadwait($sSession) ; setze Fokus in das Suchfeld $sElement = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, $sXPathGoogleSuche) ; trage Suchbegriff ein _WD_ElementAction($sSession, $sElement, 'value', $sSuche) ; Sendebutton $sElement = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, $sXPathSubmit) ; Sendebutton klicken _WD_ElementAction($sSession, $sElement, 'click') ; lese die Source der Seite in die Variable $sSource $sSource = _WD_GetSource($sSession) ; hier musst Du dann die Source weiter untersuchen MsgBox($MB_ICONINFORMATION, "Source", $sSource) ; Suche den ersten Ergebnislink in der Source - kann man mit einer Schleife erweitern ; funktioniert für genau diesen einen Suchbegriff aber nicht für jeden, dazu $sSource analysieren $iIndex1 = StringInStr($sSource, '<link href=') + 12 $iIndex2 = StringInStr($sSource, '"', 0, 1, $iIndex1) $sLink1 = StringMid($sSource, $iIndex1, $iIndex2 - $iIndex1) MsgBox($MB_OKCANCEL, "Suchergebnis (1):", $sLink1) ; Navigate to the designated URL _WD_Navigate($sSession,$sLink1) ; Wait for a browser page load to complete before returning _WD_Loadwait($sSession) MsgBox($MB_OKCANCEL, "Demo", "Zu Ende!") ; Session schließen _WD_DeleteSession($sSession) ; ChromeDriver beenden _WD_Shutdown() Func _SetupChrome() _WD_Option('Driver', 'ChromeDriver.exe') _WD_Option('Port', 9715) _WD_Option('DriverParams', ' --port=9715') $sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"goog:chromeOptions": {"w3c": true }}}}' EndFunc
-
Wenn's läuft kein Problem, ansonsten nimm die V83 von der Downloadseite bis sich der Chrome auf V84 updatet.
Und wie würde ein Beispiel z.B. für die Googel Startseite aussenen "https://www.google.de" um in das Schreibfeld zu schreiben, die Adresse des Link zu kopieren der unter den Buttons ist und dann auf den Button "Google-Suche" zu klicken?
Schreibe Dir ein kurzes Muster, aber gerade läuft der Tatort
Wird morgen werden, sind nur ein paar Zeilen. Bei der Suche kommen aber viele Links und nicht nur einer? Du bekommst den Sourcecode der Seite in einer Textvariablen und suchst selbst?
-
Das mit dem Agent mache ich mit meinem aktuellen Programm sowieso schon (siehe Bild oben). Allerdings zeigt mir das nur an, ob jemand das Programm nutzt oder nicht. Hintergrund: wenn ich ein Update einspielen will, stören die User
Könnte ich für das An/Aus natürlich ins Login- und Logout-Script packen. Gute Idee, belastet den Server überhaupt nicht und die Clients ebenfalls nicht.
-
-
-
Das würde bedeuten, dass Chrome ein Update raus bringt und alles funktioniert nicht mehr?
und man hat wieder stundenlange Arbeit, bis alles wieder lauft, muss seinen eigenen Code zusätzlich noch umschreiben... und wieder ewig die aktuellen Dateien im Internet suchen?? Das hört sich ja nicht sehr motivierend an....
Hört sich schlimmer an als es ist. Die Entwickler vom Webdriver (also die vom Chromedriver, Geckodriver,.. - nicht die von der Webdriver-UDF) scheinen mir ein etwas eigenwilliges Volk zu sein, die aus meiner (unmaßgeblichen) Sicht unmotiviert immer mal wieder Veränderungen einführen ohne Abwärtskompatibilität. Allerdings scheint sich Microsoft zusammen mit Edge Chromium da einzuklinken, vielleicht wird es dann etwas stringenter.
Das bedeutet sicherlich, dass ich diese Dateien auf allen Rechnern, auf denen ich meinen Code laufen lassen will, aktuell halten muss oder werden diese Dateien nicht mehr benötigt, wenn ich eine .exe erstellt habe?
Nein, Du musst maximal den Chromedriver aktualisieren, wenn sich die ersten beiden Stellen der Versionsnummer von Chrome ändern (aktuell 83) und Du Chrome updatest. Bei den restlichen Dateien gibt es nur Verbesserungen und Korrekturen - wenn Dein Programm einmal läuft, egal ob kompiliert als .exe oder in SciTE , dann sollte es laufen - damit hatte ich bisher keine Probleme. Ich habe den Chromedriver auf einem Netzwerklaufwerk, ist dann nur eine einzige Kopie.
Schlussendlich möchte ich mich auf einer Seite Quell-Code und Links auslesen, Buttons klicken und durch die Seiten navigieren.... Ich dache ich mache das mit Chrome, weil ich da jetzt viel mit Sendkey ausprobiert habe und das mit Chrome am besten funktioniert hat... Sendkey ist natürlich trotzdem fehleranfällig und das vor allem beim Klicken von Buttons...
SendKey ist in dem Zusammenhang übrigens immer nur eine Notlösung, wd_core bietet wesentlich bessere Funktionen dazu. Wenn der Anwender gerade mal kurz mit der Maus irgendwohin klickt, dann geht Dein SendKey irgendwohin, aber nicht dahin, wohin es soll. Mit wd_core kannst Du über den XPath genau bestimmen was wohin geschrieben oder wo geklickt wird (selbst wenn der Anwender zwischendurch auf eine andere Seite geht oder die Seite minimiert). Vor drei Monaten wusste ich auch noch nicht, was genau ein XPath ist und speziell, wie man ihn findet. Falls Dir das nichts sagt - ist nicht so schwer, wenn man es erklärt bekommt
Meine Dateien-Sammlung sieht jetzt so aus, es macht Fortschritte aber ich glaube es fehlt mir noch was.... ich weiß auch nicht, ob ich bei allem die richtige Version habe...
Sieht doch gut aus. Wenn Du den Chromedriver passend zu Deiner Chrome-Version geladen hast, läuft es. Die anderen Dateien, speziell wd_core, werden nur erweitert, da kannst Du auch mit einem älteren Stand normal arbeiten. Hast Du jetzt mal wd_demo versucht zu starten?
-
Die Zusammenhänge willst (und brauchst) Du nicht verstehen, zumindest nicht am Anfang ...
Zuerst solltest Du mal die Anzeige der Dateiendungen einschalten, damit man sieht, was Du hast und was fehlt.
Die Links sind teilweise etwas kompliziert zu orten, aber von Dan's Startseite ausgehend ist alles zu finden. Jason ist hier versteckt https://www.autoitscript.com/forum/topic/14…t-json-udf-jsmn
Beim Webdriver musst Du die passende Version zur Version Deines Browsers laden, da gibt es bei Chrome und Edge eine ganze Menge. Firefox ist da anspruchsloser.
Wenn dann Dein Verzeichnis so aussieht wie bei mir und natürlich AutoIt und SciTEE installiert sind, dann starte wd_demo.
Hier gibt es weitere Infos: https://www.autoitscript.com/wiki/WebDriver#FAQ
Ansonsten einfach mal durch die beiden Supportseiten Dan blättern, damit bin ich auch so langsam nach und nach ins Thema gekommen.
https://www.autoitscript.com/forum/topic/19…support/page/1/
https://www.autoitscript.com/forum/topic/20…elp-support-ii/
Das Projekt ist (noch) nicht so gut dokumentiert wie AutoIt und andere Projekte, aber ich habe große Hochachtung vor Dan, der das alles zusammengetragen hat und auch aktualisiert.
Wenn Du mir genauere Infos gibst, was Du machen willst, kann ich Dir vielleicht ein paar Zeilen zusammenstellen.
-
Ich will ein altes Batchprogramm "modernisieren" und auf AutoIt umstellen mit einem kurzen Script, das mir den Zustand der Clients (an/aus) im Firmennetzwerk mit einer Ampel anzeigt.
So in der Art:
In der Batch habe ich das mit Ping gemacht. War ein wenig tricky, da Ping mit der aktuellen Microsoft-Umgebung und in Verbindung mit IPV6 nicht mehr so ganz eindeutig funktioniert. Habe lange testen und suchen müssen - ohne das Find "TTL" funktioniert es nicht:
Code:ping ping %ip% -n 1 -w 1000 -l 2000 -4 | find /i "TTL" if errorlevel 1 (set rc=PcOff) else (set rc=PcOn) goto :eof
Das Ganze könnte ich jetzt so ohne Probleme in AutoIt umsetzen, aber gibt es vielleicht einfachere/bessere Methoden, um einen IP-Bereich auf an/aus zu überprüfen? Vielleicht könnte ich auch noch auf die Idee kommen, anzuzeigen, wer gerade wo angemeldet ist (dazu habe ich noch keine Idee)?
-
-
Deine Angaben sind etwas knapp. Hast Du die komplette erforderliche Umgebung runtergeladen? Hier findest Du die Voraussetzungen
Das müsste dann so aussehen:
Wenn Du alles zusammen hast, schau Dir mal die wd_demo an, da hat Dan sehr viele Beispiele untergebracht. Bei meinen ersten Versuchen habe ich die Demo einfach ein wenig verändert.
Wenn alles läuft, kannst Du den kompletten Sourcecode der aktuellen Seite mit $sResult = _WD_GetSource($sSession) in der Textvariablen $sResult finden und untersuchen.
Mit den vorhandenen Funktionen zusammen mit vorher ermittelten XPath(en) kannst Du dann u.A. Buttons anklicken, Felder ausfüllen und auslesen.
Schönes Wochenende
Hans Jürgen
-
Ok, danke! Der Fehlerfall ist dann wohl zum einen der erste Aufruf, solange noch keine .bin da ist.