vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 04.05.19 19:05

..nicht angesprungen.

Hallo erstmal, ich bin hier neu (schreib an der passenden Stelle wohl auch noch etwas), aber das o. a. Thema lässt mir seit Tagen keine Ruhe.

Ich bin quasi ein typischer Umsteiger von VBA (bis MS Access 2016) auf VB (.net), dabei hab ich schon festgestellt, dass das fast zwei unterschiedliche Welten sind, wobei ich mir hinsichtlich MS Access VBA nur noch selten etwas neues erzählen lassen muss.

Meine derzeitige Herausforderung ist es, aus einem Web-Auftritt die Haupt- und Unterseiten nach Links durchzuforsten und diese dann auf Funktion prüfen (ob ok, 403, 404, timeout usw. usf.), nach dem Umzug des dazugehörigen Forums laufen sehr viele Links ins Leere, und Google mag das garnicht und straft das gnadenlos ab.
Sicher, es gibt Tools, die das können, aber entweder sind die unflexibel, sehr langsam (hauptsächlich Freeware) oder aber deutlich überteuert (50 USD/Monat oder so), daher stelle ich mich dieser Herausforderung.
Zunächst sollen alle Links zu htm, Bildern Videos usw. gefunden und zwischengespeichert und dann der reihe nach getestet werden, eine Grundkonstrukt speziell für letzteres habe ich schon.

Ich bin an der Stelle, wo ich die Hauptseite (Outerhtml) erfolgreich nach Links durchsucht und diese in einem Array gespeichert habe.
Und jetzt komme ich nicht weiter.
Ich will nun auf die Seiten dieser gespeicherten Links navigieren und stoße mir dabei die Nase, hier der Beispielcode, reduziert auf die maßgeblichen Zeilen (fett), mit erklärenden Kommentaren, wo nötig:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'''''''''''' Button, der angeklickt wird, nachdem die Hauptseite (http:www.hauptseite.de) gefunden und ausgelesen wurde
Dim...
.
.
.
.
For...

'''''''''''' hier soll nun das Array mit den zwischengespeicherten Links verarbeitet werden (Links in
'''''''''''' Unterseiten finden und ihrerseits speichern)
.
.
Folge_Gesamt_Link_Text_ = URL_String_Array_(I1_)


'''''''''''' mit der foldenden Sub wird die Webbrowser.Navigate-Methode angestoßen, und dann kommt's, was mir
'''''''''''' Kopfzerbrechen verursacht

Sub_Folge_Url_navigieren_(Folge_Gesamt_Link_Text_)


'''''''''''' wenn der folgende Exit Sub aktiv ist, also nicht auskommentiert, wird zunächst die obige Sub
'''''''''''' verarbeitet, nach dem Exit Sub verlässt das Prog die Sub natürlich, springt dann auch die Sub's
'''''''''''' Navigated und DocumentCompletedan, ich kann dann im Formular im zweiten Webbrowser-Fenster die
'''''''''''' Seite im Formular sehen

Exit Sub


'''''''''''' eigentlich soll es hier weitergehen, also Unterwebseite ebenfalls nach Links durchsuchen, also
'''''''''''' weiter ohne den Exit Sub (den ich dann auskommentiert habe). Und genau das klappt nicht: Nach der
'''''''''''' Verarbeitung der vorigen Sub läuft das Programm weiter ohne die weiteren Sub's, also Navigated
'''''''''''' usw. zu durchlaufen

<eigentlich nächste Function...>

Next...
.
.
.
End Sub

Private Sub Web_Url1_Navigated(sender As Object, e As WebBrowserNavigatedEventArgs) Handles Web_Url1.Navigated

Url1_Eingabe.Text = Web_Url1.Url.ToString()

End Sub


Private Sub Web_Url1_Navigated(sender As Object, e As WebBrowserNavigatedEventArgs) Handles Web_Url1.Navigated

Url1_Eingabe.Text = Web_Url1.Url.ToString()


End Sub

Private Sub Web_Url1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles Web_Url1.DocumentCompleted
AddHandler CType(sender, WebBrowser).Document.Window.Error,
AddressOf Window_Error

End Sub


Was mache ich falsch? Was übersehe ich? Normalerweise finde ich als routinierter Programmierer stets eine Lösung, aber speziell zu diesem Thema habe ich bislang nicht einmal gleiche oder ähnliche Fragen/Antworten gefunden.
Vielleicht weiß hier ja jemand weiter?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: Manfred X
Datum: 05.05.19 01:16

Hallo!

Zunächst wäre zu klären, ob Du den HTML-Quelltext der Seiten nicht
über einen HTTPWebrequest laden könntest (z.B. in einen Memorystream).
Das klappt gewöhnlich, wenn die Seite nicht über Javascript-Code erst
aufgebaut werden muß (nachladen des HTML-Codes per Script).
Diese Methode ist ggf. zu bevorzugen

Falls das nicht möglich ist, wäre zu beachten, daß das WebBrowser-Control
nur ein Wrapper für den Internet-Explorer ist. Das genaue Verhalten dieses
Controls ist deshalb von den Einstellungen des Internet-Explorers abhängig.
Der Explorer verwendet z.B. Seiten-Caching, was zu unerwartetem Verhalten
führen kann (z.B. Ablauf bleibt hängen, weil ein Cache gefüllt ist oder
Aufrufe werden mehrfach aufgeführt, ich vermute weil intern im Explorer
das Laden im Multitasking läuft).

Das DocumentCompleted-Event feuert bei komplexen Seiten mehrfach, also
bereits dann, wenn aus "Sicht" des Internet-Explorers, ein hinreichender
Teil der Seite bereits geladen worden ist.
Um sicher zu stellen, daß der gesamte Seitencode im Explorer vorhanden
ist, sollte in diesem Event zuerst die Readystate-Eigenschaft des
Webbrowser-Control auf "Completed" abgefragt werden.

Beitrag wurde zuletzt am 05.05.19 um 01:29:55 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 05.05.19 08:02

Oki, erstmal Danke für die Antwort

Das Web/die Seite, um die es hier geht, verwendet Java-Script; ob die vollständig damit gehändelt/geladen wird, schaue ich mir mal an...obwohl, wenn ja, müsste dann nicht jeder navigate fehlschlagen?

Ich hatte wg. eines anderen Probs, welches ich vorher damit hatte (ständige Meldung von Java-Sript-Fehlern, was ich dann lösen konnte), mal hinsichtlich verwendetem Browser nachgeschaut.
Ich habe mir schon gedacht, dass hier IE-Eigenschaften die Rolle spielen. Ich verstehe aber trotz Deiner Erklärung immer noch nicht so ganz, warum die WebBrowser.Navigate-Methode in einem Fall funktioniert, im anderen nicht.

Folgt unmittelbar nach der Methode das End- bzw. Exit Sub des Buttons, wird die angeforderte Seite geladen, folgt jedoch danach weiterer Code in genau dieser Sub, wird die Seite nicht geladen und die beiden Events nicht angesteuert.
Wie löse ich das WebBrowser.Navigated-Event aus? Das muss doch gehen, denke ich mir, und natürlich suche ich die Erklärung zunächst in dem Fakt, dass ich mit VB.net (im Vergleich zu VBA) nur sehr sporadisch vertraut bin und mir sehr viele Basis-Kenntnisse fehlen.
Ich hatte mir extra für VB.net auch entsprechende Bücher gekauft (bin eher konservativ, benötige papierhaftes), aber dort nichts darüber gefunden, nur, wenn überhaupt, stets Hinweise, DASS die Eigenschaften navigated und completed angesteuert werden, aber außer "navigated-Methode wird durchgeführt" nicht, WIE das passiert, und selbst die Seite https://docs.microsoft.com/de-de/, die eigentlich recht gut gemacht ist, gibt sehr viel darüber her.

Ich checke nun zunächst genau ab, was Du geschrieben hast (bin noch nicht ganz wach *lach*), danach mehr.
 
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 05.05.19 15:47

Ok, Manfred X, also mit dieser Antwort
https://www.vbarchiv.net/forum/id22_i98665t98665_datagridview-bilder-url-pruefen.html
(aus 2015 )
habe ich tatsächlich etwas anfangen können, ich habe das Beispiel an meine Herausforderung angepasst, es liefert das, was ich brauche bzw. haben will...vielen Dank für speziell den Hinweis auf HttpWebRequest, das Anmelden hier hat sich schon damit vollständig gelohnt

Trotzdem ist es mir ein Rätsel - und so etwas macht mich gerade in der Programmierung nicht zufrieden - warum das hier

Navigate(URL)
Exit Sub

klappt (nach Verlassen der Sub wird zunächst zum Navigated-Event, dann zum DocumentCompleted-Event gesprungen), das hier

Navigate(URL)
nächste Sub/Function

aber nicht, dort wird zu keinem der beiden o. a. Ereignisse gesprungen; abgesehen von den "Test"-Varianten ist der Code absolut identisch

Bleibt unterm Strich, dass ich im Vergleich zu VBA ganz schön Lern- und Erfahrungsbedarf habe

Beitrag wurde zuletzt am 05.05.19 um 15:50:33 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: Manfred X
Datum: 05.05.19 17:22

Hallo!

Ich vermute, da liegt ein Mißverständnis vor.
Sobald Navigate(URL) abgesetzt ist, läuft der Haupthread einfach weiter
und führt sofort die nächste Anweisung (Aufruf der nächsten Sub) aus.
Gleichzeitig läuft ein zweiter Thread, nämlich der Ladevorgang im Browser.

Ein Sprung zu einem Event findet nicht statt.
Der Browser löst diese Ereignisse im Hauptthread aus.
Allerdings muß dazu der Hauptthread im Halte/Wartemodus sein.
Solange der Hauptthread arbeitet (die Sub mit dem Navigate-Aufruf nicht
abgeschlossen ist), kann keine Ereignisverarbeitung starten.
(Oder man setzt ein "DoEvents" in den Code).

Allerdings unterläßt der Internet-Explorer auch manchmal die Auslösung.
Das hat mit VB.Net nichts zu tun, sondern ist Explorer-Verhalten.
In dem Fall hilft es meist, die Seite noch einmal aufzurufen
(z.B. Navigate timergesteuert wiederholen).

Zu dem Zweck kann man vor dem Navigate-Aufruf eine modulglobal definierte
Datetime-Variable mit der aktuellen Zeit füllen.
Im DocumentCompleted-Event wird diese Zeit gelöscht (Variable auf Nothing setzen).
Der Timer prüft im Tick-Event, ob eine Startzeit gegeben ist und bestimmt
ggf. die Differenz zwischen aktueller Zeit und Startzeit. Ist diese Differenz
zu groß, wird der Navigate-Aufruf erneut ausgeführt.

Beitrag wurde zuletzt am 05.05.19 um 17:28:24 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 05.05.19 20:21

Jepp, das mit dem Missverständnis sehe ich ähnlich, hab ich wohl auch selber ein wenig "in Gang" gesetzt.

Das mit dem HttpWebRequest war doch nicht so ganz die Lösung, hat mich aber mit dem Lesen hier nachdenken lassen.

Die DoEvents-Anweisung habe ich ganz zu Beginn versucht, aber VB 2015 mag die nicht mehr. Auch habe ich schon von mir aus nach Möglichkeiten gesucht, z.B. den Naviagate erneut aufrufen, tatsächlich auch Zeit-Verzögerungen...hat alles nichts gebracht, vielleicht war/bin ich auch ungeduldig.

Ich habe mir jetzt anders beholfen, mit etwas ähnlichem wie einen rekursiven "Call".

Der erste Navigate funktioniert ja reibungslos, die zu durchsuchende Hauptseite ist verfügbar.

Im nächsten Schritt, ausgelöst durch einen Klick-Button, werden alle Links (OuterHtml) dieser Seite ausgelesen und in ein Array gepackt, und dann wird es aufmerksamkeits-intensiv: Bereits dieses Array und dessen Zähler müssen von Beginn an Public deklariert werden, damit die Inhalte für die nächsten Aktionen (Preserve und so weiter) erhalten bleiben.

Ich starte den Array For-Next, rufe dort dann den nächsten Navigate auf ud verlasse die (nun) Function. Die beiden Events werden dann durchlaufen, und in der DocumentCompleted-Ereignis-Sub rufe ich am Ende erneut vorgenannte Funktion auf...die kommt natürlich wieder an die Stelle, wo erneut der For-Next durchgeführt wird, wobei der For stets mit der hochgezählten Public-Variablen aufsetzt.

Auf diese Weise erhalte ich tatsächlich stets die nächste Url, kann das auch im Browser-Steuerelement beobachten.

So sollte es wirklich gehen, erfordert allerdings unglaublich viel Aufmerksamkeit, mehr als sowieso schon.

Alle anderen Möglichkeiten sind mir zu vage und zu unberechenbar, ich habe das Gefühl, als könne ich die nicht wirklich kontrollieren.

Nichtsdestso weniger ungekürzt Danke...das hier hat meine Gedanken doch ein wenig anders laufen lassen, die waren wirklich festgefahren.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: Manfred X
Datum: 05.05.19 21:00

Verwende eine generische List(of String) statt einem Array.
(Namespace System.Collections.Generic)
Diese Liste kapselt ein Array und stellt die Methoden zur Verfügung
(z.B. Add, Remove, Clear), durch die eine dynamische Anpassung der Zahl
der Elemente vorgenommen werden kann.
Im Klassen-Konstruktor (New) kann ein geeigneter Startwert vorgegeben
werden.

Das Verfahren mit dem timergesteuerten "Reload" hat bei mir bisher stets
funktioniert.
Ich gehe zunächst alle Hauptseiten durch und speichere alle dort vorhandenen
Links zu den Daten und die Links zu Unterseiten in einer Datei, danach lade
ich die jeweils erste Unterseite und notiere alle Links in den ersten Unterseiten
usw.
Dieses Vorgehen funktioniert - ich habe die Verzögerung sogar über DoEvents-
Schleifen realisiert, weil ich zu "faul" war, die Sache genauer zu durchdenken.

Beitrag wurde zuletzt am 05.05.19 um 21:13:10 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 18.05.19 15:30

So, tatsächlich habe ich jetzt (gewünschte) Ergebnisse, zunächst mal Danke, Manfred X

Nach den Meldungen meiner ersten Versuche musste ich ja davon ausgehen, dass DoEvents veraltet sei und schon lange nicht mehr implementiert ist/klappt, schon garnicht in VB.NET.
Ich habe mich aus gegebenem Anlass sehr viel tiefer in die VB.NET-Materie eingearbeitet (meine Vorgehensweise nennt man aber wohl besser "hineingefummelt" ), und jetzt klappt es auch mit dem Application.DoEvent(), wenn der in einer Schleife abwartet, bis die Seite geladen ist.

Der Tipp mit der generischen Liste war ebenfalls ungemein hilfreich, aber die Beschäftigung damit hat etwas gedauert, beinahe seit Deinem Vorposting.

Ich bin da auf ein paar Überraschungen gestoßen, mit denen ich nicht rechnen musste, vor allem der Umgang generischer Listen mit Indizies (ich will nach Fertigstellung der Sammlung, also vollständigem Durchsuchen des Webs, mehrfache identische Einträge entfernen) hat mich total überrascht.

Aber gut, nun kann ich das umständliche Handling mit Arrays, aber auch die Umwege nach dem Anstoßen der Navigation entfernen.

Wie schon zu Beginn geschrieben, dass sich VB.NET dermaßen von VBA unterscheiden würde, damit habe ich nicht gerechnet.

Nebenbei: Die grundsätzlich guten Erklärungen in "https://docs.microsoft.com" haben mich manchmal etwas ungeduldig gemacht, weil um ein kleines hilfreiches Beispiel einer bestimmten Methode, Eigenschaft, wie auch immer, herum mitunter eine umfangreiche "Anwendung" gezeigt wird und der User, also meine Wenigkeit, den Kern herauszufinden hat.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 06.06.19 09:47

Manfred X schrieb:
Zitat:

(..)Ich gehe zunächst alle Hauptseiten durch und speichere alle
dort vorhandenen
Links zu den Daten und die Links zu Unterseiten in einer
Datei, danach lade
ich die jeweils erste Unterseite und notiere alle Links in
den ersten Unterseiten
usw.
Dieses Vorgehen funktioniert - ich habe die Verzögerung sogar
über DoEvents-
Schleifen realisiert, weil ich zu &quot;faul&quot; war, die
Sache genauer zu durchdenken.


So, mittlerweile bin ich an genau dieser Stelle, wobei auch ich von vornherein davon ausgegangen bin, das Ganze "Tannenbaum"-mäßig aufzuziehen...hat soweit auch gut funktioniert, einschl. Deiner Tipps mit den generischen Listen, ich kann gefundene Links jetzt entsprechend separieren, also danach, ob die nur gecheckt werden müssen oder ihrerseits auf eine darunter liegende Seite verlinken, die auch nach Links durchsucht werden muss.

Tatsächlich klappt es nun auch mit dem DoEvents(), sieht hier halt etwas anders aus als der bei VB6

Was mich, mal nebenbei bemerkt, an Code-Beispielen im Internet (warum das Rad neu erfinden müssen, wenn es intakte Lösungen gibt) so immens stört: Fast immer sind die [u]nicht mit hilfreichen Inline-Kommentaren versehen (für mich als Entwickler ein absolutes Muss), und so gut wie immer werden für Variablen-Namen irgendwelche kryptischen Bezeichner benutzt, wo sogar ich als VB-Fachmann manchmal kurz überlegen muss, ob es etwas VB-spezifisches ist oder die "Erfindung" eines findigen Code-Schreibers...wie soll dann erst jemand, der sich mal (z. B. als Hobby) an so etwas versuchen will, herausfinden, ob "StrFndlOJx" eine Anweisung, Methode, Eigenschaft oder doch einfach nur der nichtssagende Name einer Variablen ist, deren Deklaration ggf. nicht einmal im Beispiel-Code erscheint, weil die "Dim"-Statements nicht mit angezeigt werden

Das Ergebnis des letzten General-Testlaufs über das fragliche Web war zufriedenstellend...gestört hat mich noch heftig, dass recht oft die Geräusche/Musik-Sequenzen (zumindest die ersten Takte) zu hören sind.

Ich hatte mir kurz mal Deinen Hinweis auf die Nutzung mit HttpRequest angeschaut, das aber verworfen, weil - losgelöst davon, dass die Webseite derzeit mobil-fähig gemacht wird - nicht sicher ist, ob in absehbarer Zukunft Java-Script eine Rolle spielen wird, und mit dem Gebrauch, egal, in welchem Zusammenhang, würde ich mich offen gestanden überfordert fühlen.

Auf alle Fälle Danke für Deine Hinweise, ich musste zwar sehr viel genauer "nachbuddeln", um das für mich zu übersetzen, aber auch dafür bin ich dankbar, hat mich eher vorangebracht, als mir Beispiel-Codes mit der Überschrift "So geht's" oder "ist doch ganz einfach" anzuschauen

Beitrag wurde zuletzt am 06.06.19 um 09:52:20 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 06.06.19 18:23

Und dazu jetzt doch nochmal ne Frage:

Es funktioniert zwar alles so weit, aber irgendwie hadere ich noch mit folgendem, was auch meiner Unerfahrenheit im Umgang mit Web-Angelegenheiten bezügl. Programmierung geschuldet ist:

Eine Web-Seite, die man mit Firefox oder Chrome oder auch IE (mit dem Edge funktioniert das nicht so einfach) aufruft, kann man bekanntlich per Kontext-Menü nach Maus-Rechtsklick
1) als Htm(l) speichern, ist dann Textformat, kann mit dem Editor gelesen werden
2) sich den Seiten-Quelltext anzeigen lassen und diesen letztlich auch als Textdatei speichern (z. B. copy und paste)

Der Unterschied ist der - die meisten werden es wissen, ich beschreibe es trotzdem nochmal -, dass im Text mit 1) hinter "href=" die vollständigen Links angezeigt werden, mit 2) jedoch jenes Format, welches auch der OuterHtml-Ausgabe gleicht, ausgegeben wird, der Unterschied sieht dann so aus:

1) href="http://www.hauptseite.de/unterseite.htm"
2) href="unterseite.htm"

In der (bisherigen) Nutzung mit dem Webbrowser-Steuerelement und allem, was so dazu gehört, habe ich es stets mit der Ausgabe 2) zutun, muss dann, um prüffähige Links zu erhalten, stets den Link unter 2) an den Hauptlink anfügen.

Meine Frage nun: Gibt es die Möglichkeit, per VB.NET-Code auch an das Format unter 1) zu kommen?

Ich habe doch ein gutes Stück Zeit mit der Suche danach verbracht, leider auch dazu eigentlich überhaupt nichts gefunden, nicht einmal das Statement, dass das nicht geht.
Wenn es wirklich definitiv nicht geht, ist es ok, ich brauch da nur die Gewissheit.

Wenn das aber doch geht, bitte, wie? Was übersehe ich? Ist das so leicht, dass ich nur den Wald vor lauter Bäumen nicht sehe?

Beitrag wurde zuletzt am 06.06.19 um 18:25:42 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 13.06.19 19:12

Manfred X schrieb:
Zitat:

(..)Zu dem Zweck kann man vor dem Navigate-Aufruf eine
modulglobal definierte
Datetime-Variable mit der aktuellen Zeit füllen.
Im DocumentCompleted-Event wird diese Zeit gelöscht (Variable
auf Nothing setzen).
Der Timer prüft im Tick-Event, ob eine Startzeit gegeben ist
und bestimmt
ggf. die Differenz zwischen aktueller Zeit und Startzeit. Ist
diese Differenz
zu groß, wird der Navigate-Aufruf erneut
ausgeführt.

Ich komme ja irgendwie immer noch nicht so richtig weiter

Der Hinweis auf Application.DoEvents() war ja hilfreich, und bis zu einem bestimmten Punkt funktioniert der auch wie er soll und es gedacht ist.
Aber plötzlich bleibt das Tool dann doch plötzlich stehen, meistens bei/mit einem bestimmten URL.

Ich habe, um das herauszufinden, das Programm mal bis zu dem Punkt laufen lassen, bevor zu diesem Link navigiert werden soll.

Das Browser-Steuerelement heißt Web_Url1, der Web_Url1.Navigate(New Uri(Link) wird durchgeführt, der Code geht zum Web_Url_Navigated, springt wieder zurück in die Navigate-Sub.
Ich habe gleich hinter dem Navigate-Befehl die Application.DoEvents() eingefügt mit einer Bedingung, die durch die DocumentCompleted-Eigenschaft erfüllt wird, so dass das Programm beim nächsten Rücksprung in das Navigate-Ereignis die Schleife mit Application.DoEvents() verlässt.
Der Code schaut so aus (bitte nicht lachen, ich bin halt VB.NET-Neuling):

    Private Sub Sub_Folge_Url_navigieren_(Url1_Sub_Weiterleitung_ As String)
        Try
            Web_Url1.Navigate(New Uri(Url1_Sub_Weiterleitung_))
            While Web_Url1.Tag <> ""
                Application.DoEvents()
            End While
        Catch Erklaerung1_ As System.UriFormatException
            Return
        End Try
 
    End Sub
 
    Private Sub Web_Url1_Navigated(sender As Object, e As _
      WebBrowserNavigatedEventArgs) Handles
              Web_Url1.Navigated
 
        Url1_Eingabe.Text = Web_Url1.Url.ToString()
 
    End Sub
 
    Private Sub Web_Url1_DocumentCompleted(sender As Object, e As _
      WebBrowserDocumentCompletedEventArgs)
         Handles Web_Url1.DocumentCompleted
        AddHandler CType(sender, WebBrowser).Document.Window.Error,
            AddressOf Window_Error
        Web_Url1.Tag = ""
 
    End Sub
Das Thema ist halt wie geschrieben, dass der Code mit benanntem Url die letzte Sub nicht erreicht und somit in einer Endlos-Schleife hängt (klar, Web_Url1.Tag hat ja Zeichen) und dort nicht mehr herauskommt, auch nicht in die Navigated-Sub.

Ich habe natürlich Dein oben zitiertes Statement mit dem Timer im Kopf, kann aber leider ohne (aussagefähiges) Beispiel nicht viel damit anfangen

Ich bin nunmal leider jemand, der Beispiele zum Verstehen-können und Ausprobieren benötigt, auf diese Weise habe ich mich in der Zwischenzeit z. B. recht gut in die "Geheimnisse" des Umgangs mit generischen Listen, auch mehrdimensionale, hineingearbeitet.
Im Moment komme ich da wirklich nicht weiter, das nervt und frustriert
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 25.06.19 20:49

Mittlerweile bin ich auch mit dem Thema des Vorpostings durch, ich lade das Html-Document, nicht die OuterHtml-Inhalte.
Ich bin inzwischen wirklich richtig böse: Die Herausforderungen, mit denen ich mich hier herumschlage, können einfach keine Exoten sein, es gehört der o. a. Unterschied dazu, es gehören mehrere Möglichkeiten mit den generischen Listen dazu, Techniken, mit denen man Links checken kann, und eben auch das Thema, mit welchem ich diesen Thread aufgemacht habe.

Da bin ich inzwischen wieder gelandet.
Der Einsatz des Statements
While Readystate <> Completed
Application.DoEvents() End While
klappt...wenn, ja, wenn Links/Webseiten alle einigermaßen "korrekt" (so nenne ich das mal) wären.
Es kommt aber leider vor, zwar nicht oft, aber einmal reicht schon, dass der Readystate-Wert bei 3 (Interaktion)hängen bleibt und nicht witergeht, und leider bleibt der Application.DoEvents() gnadenlos in der Schleife hängen, und mir fällt kein adäquates Mittel dagegen ein.

Irgendwelche timergesteuerten Reloads nützen nix, es ist ja die gleiche Seite.
Auch mit der Threading-Technik (Manfred X hatte da was erwähnt) bin ich nicht weitergekommen; macht man aus der Sub mit dem Navigate ein Thread und ruft die mit
dim ThreadVar As New Thread(AddressOf Navigate_Sub))
ThreadVar.Start(WelblinkText)
auf, passiert überhaupt nichts, es ist nicht erkennbar, dass das Programm diesen Thread als solchen behandelt hat.

Es muss doch ein einfaches Mittel geben, mit welchem man zu Links naviggieren kann ohne dafür irgendwelche Verrenkungen machen zu müssen, damit der Navigate die nachfolgenden Events abarbeitet.

Ich habe bislang dazu nicht s wirklich hilfreiches gefunden, im schlimmsten Fall gar "Beispiele", denen man fast entnehmen könnte, dass die "Ratgeer" sich irgendwo nen theoretischen Beispiel-Code ergooglet haben, ohne den auch wirklich zu testen/prüfen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: Kuno60
Datum: 25.06.19 22:07

Hallo!

Manfred X hat in seiner ersten Antwort das Problem bereits beschrieben.

Das Webbrowser-Control ist zum Erkennen, ob eine Seite komplett geladen wurde, nur teilweise geeignet.
Das DocumentCompleted-Event wird mehrmals ausgelöst, da der Browser intern zu weiteren Links navigiert (z.B. Werbung). Bei animierten Inhalten kann es sogar sein, dass das DocumentCompleted-Event gar nicht ausgelöst wird, da ständig zu Teilinhalten navigiert wird.

Um im Completed-Ereignis zu einer neuen Seite zu navigieren, benutze einen zweiten Webbrowser oder schalte einen Timer mit einer Zeitverzögerung dazwischen.

Mein Vorschlag:

Lade die gewünschte Seite über HttpWebRequest runter und durchsuche sie (z.B. mit RegEx) nach weiteren Links, die dann ebenfalls über HttpWebRequest geladen werden.

Wenn du eine Kontrolle haben willst, so kannst du direkt den geladenen Html-Code, an einen beliebigen Browser oder das WebBrowser-Control, übergeben.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 26.06.19 07:16

Kuno60 schrieb:
Zitat:

Mein Vorschlag:

Lade die gewünschte Seite über HttpWebRequest runter und
durchsuche sie (z.B. mit RegEx) nach weiteren Links, die dann
ebenfalls über HttpWebRequest geladen werden.

Wenn du eine Kontrolle haben willst, so kannst du direkt den
geladenen Html-Code, an einen beliebigen Browser oder das
WebBrowser-Control, übergeben.

Danke für die Antwort

Die meisten der Erkenntnisse habe ich ja schon.
Solange der Navigate funktioniert, ist ja alles ok, besser geht's kaum.

Nur wenn es sich herausstellt, dass der RaedyState nicht über 3 hinaus kommt, ist es ja schon zu spät.
Desweiteren kann man fast davon ausgehen, dass in solchen Fällen Javascripts im Weg sind, da klappt der HttpRequest auch nicht.
Edit Das habe ich eben ganz vergessen: Wenn ich zu jener Seite, die im regulären Code beim ReadyState "Interactive" stehenbleibt, separat mit einem Button-Klick navigiere, dann klappt es ja Edit Ende

Das mit der Timer-Angelegenheit habe ich erstmal auf Eis gelegt, es gibt nirgends ein kleines einfaches Beispiel dazu, anhand dessen man mal ausprobieren könnte, wie es funktioniert.
Wenn ich so ein Beispiel vorfinde, übernehme ich das nicht einfach so blind, ich will erstmal verstehen, wie es funktioniert.
Das gilt übrigens für so gut wie jede Herausforderung, die sich mir hier stellt. Trotz maßgeblich umfangreicher "Dokumentationen", die so herumgeistern, musste ich mir fast jeden kleinen Schritt erst selber "heraus arbeiten"
Ich habe diesen Thread nicht ohne Grund hier "VB.NET Einsteiger/Umsteiger" eröffnet; wären meine Kenntnisse Erfahrungen hinsichtlich VB.NET auch nur annähernd umfangreich wie die mit VBA/VB6, hätte sich mir diese Frage womöglich garnicht gestellt.
Ich habe natürlich auf meinen ständig nötigen Recherchen auch Code-Beispiele gefunden, aber bis auf ganz wenige Ausnahmen konnte sogar ich als VB.NET-Neuling fast immer auf den ersten Blick erkennen, dass diese "Beispiel-Codes" ganz bestimmt nicht getestet wurden

...das alles mal so am Rande, ich bin mittlerweile ganz schön aufgebracht


Ganz sicher Danke für Eure Vorschläge, ehrlich Aber meine Haupt-Bedenken bei den meisten: Diese/n Umweg/e nur wg. 1 von gefühlten 500 Seiten machen?

Wir haben einige Tools ausprobiert, mit denen man "tote Links" ermitteln kann (das ist der Anlass für meine Bemühungen) - entweder sind die kostenlos mit der entsprechenden "Qualität" oder sauteuer, 50$ monatlich oder so -, aber eines konnten die alle: Links finden, auch in JavaScript generierten Seiten.

Sollte es in diesem doch recht mächtigen Instrument VB.NET wirklich kein adäquates Board-Mittel geben?

Beitrag wurde zuletzt am 26.06.19 um 07:44:39 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: Manfred X
Datum: 26.06.19 10:25

Hallo!

Das DoEvents ist eine Primitivlösung.
Setze vor Deine DoEvents-Schleife eine DateTimeVariable und
weise ihr die aktuelle Zeit zu.
Innerhalb der Schleife vergleichst Du nach dem DoEvents-Statement
den aktuellen Zeitpunkt (Now) mit dem Vorab-gespeicherten Wert.
Wird die Differenz zu groß, brichst Du das Warten ab.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 26.06.19 11:04

Manfred X schrieb:
Zitat:

Hallo!

Das DoEvents ist eine Primitivlösung.
Setze vor Deine DoEvents-Schleife eine DateTimeVariable und
weise ihr die aktuelle Zeit zu.
Innerhalb der Schleife vergleichst Du nach dem
DoEvents-Statement
den aktuellen Zeitpunkt (Now) mit dem Vorab-gespeicherten Wert.
Wird die Differenz zu groß, brichst Du das Warten
ab.

Das mit dem DoEvents sehe ich mittlerweile auch so, aber es ist das einzige, was bislang [u]fast zuverlässig funktioniert hat...wären da bloß nicht die Seiten, die bei direkter Eingabe im Browser (Edge, Firefox, Chrome und versuchsweise auch IE) sofort angezeigt werden, aber irgendwie noch "herumrödeln".

So etwas ähnliches wie mit dem Timer (jetzt habe ich es verstanden ) versuche ich gerade.
Ich hatte kurz in der DoEvents-Schleife den ReadyState nach 3 abgefragt und sie verlassen, wenn zutreffend, aber da wurde, wie ich jetzt weiß, nicht einmal die Hälfte der gewünschten Inhalte geladen (wie ich schon schrieb).

Danke für den Tipp mit dem Timer, darauf werde ich wohl zurückgreifen.
Ich bin auch ein wenig verwirrt, warum das mit den Threading.Threads nicht wie gewünscht hingehauen hat (es war Dein Hinweis in Deiner 2. Antwort, erschien mir schlüssig, der gesamten Navigate-Aktion einen eigenen exklusiven Thread zuzuweisen, um dann auch die folgenden Events Navigated und Completed auslösen zu können), aber das rechne ich meiner Unerfahrenheit mit dem Thema zu, wer weiß, was ich da auch bei größter Aufmerksamkeit verkehrt oder nicht oder zu viel gemacht habe
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 26.06.19 17:18

So, ich habe mir jetzt erstmal einen "primitiven provisorischen Zeitgeber" in die DoEvent-Schleife eingebaut, der sorgt daafür, dass spätestens nach gut 20 Sekunden der Vorgang "abgebrochen" wird, wenn der Ready-Status fortwährend bei unter 4 bleibt.

Ich teste das gerade, und schon der Verlauf des Einsammeln von Links scheint eine ganz andere Dimension zu haben, im positiven Sinne.

Ist natürlich nach wie vor nicht ausgestanden, das Ganze, mich stört weiterhin nachhaltig, dass nirgends etwas darüber zu stehen scheint, wie man mit dieser Herausforderung mit VB.Net Boardmitteln umgehen kann, ohne irgendwelche Programm-Klimmzüge machen zu müssen.

Ich weiß noch nicht, ob das Ergebnis gleich wirklich stimmt (einen Logik-Fehler meinerseits habe ich schon bemerkt, aber der hat mit dem Navigate-Prob nichts zutun), aber an dieser Stelle schonmal Danke für die Tipps...ich hatte (und habe immer noch) damit zumindest gute Anhaltspunkte
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 29.06.19 10:06

Manfred X schrieb:
Zitat:

(..)den aktuellen Zeitpunkt (Now) mit dem Vorab-gespeicherten Wert.
Wird die Differenz zu groß, brichst Du das Warten
ab.

Ich habe das Tool jetzt das erste Mal vollständig laufen lassen, die Ergebnisse sehen nicht schlecht aus, aber so ganz traue ich dem "Frieden" noch nicht...und es hat fast 9 Stunden gedauert, bis knapp 114.000 Links auf Validität gecheckt waren (da sind die vorigen gut 4 Stunden für das Einsammeln der Links noch gar nicht enthalten), ganz schön lange!
Und das hat mit der obigen Aufgabenstellung zutun.
Ich habe wie schon geschrieben dafür gesorgt, dass der Navigate bis zu 25 Sekunden Zeit hat, über den Status 3 (Interactive) hinaus zum 4 (Complete) zu kommen.
Meine Frage: Reicht diese Zeitspanne? Oder kann es wirklich sein, dass so etwas auch mal 3 oder 4 oder 5 Minuten dauern kann? Oder gibt es einen Zeitpunkt, ab dem es keinen Sinn mehr macht, noch länger zu warten?

Ich kann so eine Zeitspanne problemlos erstellten, die Dauer des Laufs würde sich auch nicht exzessiv verlängern, es sind ja nicht mehr wirklich viele, die nach knapp 25 Sekunden immer noch Status 3 haben, aber auch von denen brauche ich ja möglichst [u]alle Links im Html-Dokument, die gecheckt werden sollen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: Manfred X
Datum: 29.06.19 12:26

Du willst nicht nur die "harten" Links im Code des HTML-Dokuments, sondern die
Links, die durch ein Dokument auch indirekt (durch enthaltene Skripte oder
Datenbank-Abfragen) geliefert werden.
Deine Frage kann man nicht beantworten, weil es viele Faktoren gibt,
von denen die Dauer abhängt, bis eine abgerufene Internet-Seite vollständig
übermittelt und im Ziel aufgebaut ist - z.B. ein ineffektiv programmiertes
Skript.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 29.06.19 16:18

Manfred X schrieb:
Zitat:

(..)Deine Frage kann man nicht beantworten, weil es viele
Faktoren gibt,
von denen die Dauer abhängt, bis eine abgerufene
Internet-Seite vollständig
übermittelt und im Ziel aufgebaut ist - z.B. ein ineffektiv
programmiertes
Skript.

*lach* Eine genaue Zeitangabe wäre natürlich ideal

Nein, das wäre unrealistisch...aber so'ne Hausnummer müsste es doch geben, die sinngemäß aussagt, dass ab 5 Minuten (oder 2 oder 3) nichts mehr passieren wird...mit den die Regel bestätigenden Ausnahmen kann auch ich leben
Ich habe mir die Ergebnislisten mal gesehen, und es sind aus meiner Sicht schlicht zuviele, die auch nach gut 20 Sekunden nicht vollständig geladen wurden (ca. 360 von ca. 5100), da müsste noch etwas gehen

Beitrag wurde zuletzt am 29.06.19 um 16:20:33 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: Manfred X
Datum: 29.06.19 17:16

Du mußt checken, WARUM die nur verzögert geladen werden. Ob das bei jedem Aufruf so ist.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 29.06.19 18:48

Jepp, ist ohnehin in Vorbereitung, ich habe am Nachmittag noch einen "fetten" fachlichen Fehler entdeckt (der glücklicherweise keine Code-Klimmzüge mit sich bringt), daher muss ich diesen Testlauf vollständig wiederholen; und da ich die vorigen Ergebnisse gesichert habe, werde ich es dann ja gewahr

Noch ein Edit: Die in Frage kommenden Seiten (also mit permanentem "Interactive") beinhalten allesamt auch Werbung, Links zu Google und solchen Geschichten, auch (erlaubte) Bannerwerbung ist enthalten, würde mich nicht wundern, wenn das einer der Gründe, vielleicht gar DER Grund ist.

Beitrag wurde zuletzt am 29.06.19 um 18:58:51 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: Manfred X
Datum: 29.06.19 19:09

Setze einen Adblocker im Internet-Explorer ein.
Ich habe die Erfahrung gemacht, daß komplex aufgebaute Seiten auch
"einfach so" mal hängenbleiben (Serverüberlastung?)
Ein erneuter Aufruf kann in solchen Fällen meist Abhilfe schaffen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Nach navigate-Methode werden die Navigated- und DocumentCompleted-Eigenschaften. 
Autor: EKrause
Datum: 29.06.19 21:57

Das mit dem Ad-Blocker wäre eine gute Idee, wenn ich das Tool nur für mich bzw. die Webseite/das Forum nutzen würde, für welches ich das Tool baue, da hätte ich einiges "schlichter" machen können, hard-codierte Link-Angaben und so

In der Tat habe ich die Anwendung auf unserem Web testweise komplett durchlaufen lassen, die betroffenen Seiten sind reine Lösungsseiten für ein Game, untermalt mit Videos, Bildern, natürlich auch Werbung, wie schon erwähnt usw. usf....die Seite ist bekannt und vergleichsweise stark frequentiert, aber der Server (bekannt, seriös und ausgesprochen belastbar) ist keinesfalls überlastet.

Etwas anderes fällt mir dazu noch ein: Ich habe das (verweilen auf "Interactive") ja schon mit einigen Seiten gehabt, und an eines erinnere ich mich: Wenn ich die betreffende Seite als Start angegeben habe, ist dieses Prob nicht aufgetaucht.
Es ist auch ein anderes Webbrowser-Steuerelement als jenes, mit dem ich die "Stapel-Verarbeitung" durchführe, aber mit identischen Einstellungen.

Ich habe über einiges schon nachgedacht, z. B. über den Browser-Cash o. ä., aber dazu geben auch die Internet-Optionen, die zum Visual Studio 2017 Community gehören, nichts her...alles ohne Wirkung

Beitrag wurde zuletzt am 29.06.19 um 21:58:39 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel