HTML & VB via GeckoWebBrowser Problemstellung

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 53 Antworten in diesem Thema. Der letzte Beitrag () ist von Popa21.

    HTML & VB via GeckoWebBrowser Problemstellung

    Hi!
    Ich versuche schon seit Stunden, alles was ich aber bereits versucht habe, wurde mir als Fehler ausgegeben :/
    Also folgendes: Ich habe nen BackgroundWorker "installiert", der klappt auch.
    Ich habe in meinem Programm einen eingebauten Webbrowser, der ne Webseite von einem Streaming-Dienst aufruft.
    Jetzt möchte ich zusammen mit dem BackgroundWorker erreichen, dass sobald die Pause, Zurück oder Vorwärts-Taste auf der Tastatur betätigt wird,
    sozusagen auf die jeweiligen Zurück, Vorwärts und Pause-Tasten gedrückt wird durch den Webbrowser.
    Achja, ich habe einen GeckoWebBrowser.

    Codeansatz:

    VB.NET-Quellcode

    1. Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    2. up:
    3. 'Weiter
    4. If (GetAsyncKeyState(176)) Then
    5. End If
    6. 'Zurück
    7. If (GetAsyncKeyState(177)) Then
    8. End If
    9. 'Pause
    10. If (GetAsyncKeyState(179)) Then
    11. End If
    12. System.Threading.Thread.Sleep(100)
    13. GoTo up
    14. End Sub

    Wie gesagt, alle versuchten Codeansätze bzgl. des Klicken auf Vorwärts, Zurück und Pause vergeblich.


    Zu der Webseite:

    Dazu gehört folgender HTML-Code:

    HTML-Quellcode

    1. <div class="buttons">
    2. <i class="icon icon-to-start prev"></i>
    3. <i class="icon icon-play toggle-play" ng-if="!player.loadingTrack &amp;&amp; !player.isPlaying"></i>
    4. <i class="icon icon-to-end next"></i>
    5. </div>

    Developement schrieb:

    Codeansatz
    ist völlig daneben.
    Gib Deiner Form .KeyPreview = True und arbeite im KeyDown- oder KeyUp-Event der Form.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Developement schrieb:

    im Hintergrund
    Jou.
    Dann nimm statt des BGW einen schnöden Timer, der läuft im selben Thread wie die GUI.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Dann nimm statt des BGW einen schnöden Timer.

    Und wie kombiniere ich den Timer mit dem KeyDown-Event?

    Codeansatz
    ist völlig daneben.​
    Naja, solange es doch mit dem aktuellen Code klappt (habe es damit getestet), sollte es doch keine Mängel geben. Oder machst du dir wegen der Performance Gedanken?

    Developement schrieb:

    Und wie kombiniere ich den Timer mit dem KeyDown-Event?
    Gar nicht.
    Statt Handles BackgroundWorker1.DoWork machst Du Handles Timer1.Tick, natürlich mit den richtigen Argumenten un der Funktion.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Developement schrieb:

    Hauptproblem
    Du willst den Gecko fernsteuern?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Du willst den Gecko fernsteuern?
    Ich will, sobald der User die Zurück, Vor oder Pause Taste drückt, das jeweilige HTML Element geklickt wird (auch im Hintergrund).

    Die auf der Webseite befindlichen Knöpfe dazu haben folgenden Code:

    HTML-Quellcode

    1. <div class="buttons">
    2. <i class="icon icon-to-start prev"></i>
    3. <i class="icon icon-play toggle-play" ng-if="!player.loadingTrack &amp;&amp; !player.isPlaying"></i>
    4. <i class="icon icon-to-end next"></i>
    5. </div>
    @Developement OK. Von HTML hab ich keine Ahnung.
    Du kannst natürlich die Maus auf dem jeweiligen Button positionieren und einen Klick auslösen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das hab ich in Web gefunden, ausprobiert & hat geklappt (mit anderen Webseiten!)

    VB.NET-Quellcode

    1. GeckoWebBrowser1.Navigate("javascript:void( document.getElementById( 'idname' ).click() ) ")


    Jedoch funktioniert der Code bei anderen Webseiten, aber nicht bei der, die ich brauche, denn es gibt keine ID für Vorwärts Zurück und Pause.

    Der Code der Seite, auf der ich jeweils auf die HTML Elemente drücken möchte:

    HTML-Quellcode

    1. <div class="buttons">
    2. <i class="icon icon-to-start prev"></i>
    3. <i class="icon icon-play toggle-play" ng-if="!player.loadingTrack &amp;&amp; !player.isPlaying"></i>
    4. <i class="icon icon-to-end next"></i>
    5. </div>


    Wie man sieht gibt es nur jeweils Klassen.
    Hab deshalb auch schon folgendes probiert (im Beispiel für die Pause-Funktion):

    VB.NET-Quellcode

    1. GeckoWebBrowser1.Navigate("javascript:void( document.getElementByClassName( 'icon icon-play toggle-play' ).click() ) ")

    Hat leider auch nicht geklappt. Hat jemand einen Vorschlag? Wäre sehr dankbar.

    Popa21 schrieb:

    und für mich sehen die Controlls eher nicht nach Button aus.
    Sie sehen nicht danach aus und sind es auch nicht. Habe mal nachgeschaut, das ganze nennt sich "FontAwesome", das ist ein Icon Pack welches man einbinden kann mit <i class=...>
    Damit wird das Icon angezeigt, ich denke mit der Klasse wird auch seine Funktion gleich zugeordnet. Auch wenn es kein Button ist,
    müsste doch trotzdem klappen, dass man draufklicken kann, oder?
    Probier das mal aus:

    VB.NET-Quellcode

    1. Dim button As GeckoHtmlElement = DirectCast(GeckoBrowser.Document.GetElementById("button_id"), GeckoHtmlElement)
    2. button.Click()


    oder:

    VB.NET-Quellcode

    1. Dim button As GeckoHtmlElement = DirectCast(GeckoBrowser.Document.GetElementsByClassName("button_class"), GeckoHtmlElement)
    2. button.Click()


    Das koennte auch noch relevant sein:
    stackoverflow.com/questions/38…vascript-function-calling
    And i think to myself... what a wonderfuL World!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Eddy“ ()

    Eddy schrieb:

    Dim button As GeckoHtmlElement = DirectCast(GeckoBrowser.Document.GetElementById("button_id"), GeckoHtmlElement)
    button.Click()

    Funktioniert nicht, da es ja wie schon erwähnt keine ID gibt.

    Eddy schrieb:

    Dim button As GeckoHtmlElement = DirectCast(GeckoBrowser.Document.GetElementsByClassName("button_class"), GeckoHtmlElement)
    button.Click()
    Das hab ich selbst durch Ausprobieren und Surfen auch zusammengebastelt, da bringt Visual Studio aber folgenden Fehler:
    Der Wert vom Typ "GeckoNodeCollection" kann nicht in "GeckoHtmlElement" konvertiert werden.

    Was kann man machen, dass der Fehler nicht auftaucht? Weil Klassen haben die "buttons" (sind ja keine buttons, sind solche speziellen icons) ja, damit sollte man sie ja "identifizieren" können.
    @Eddy Das ist dasselbe auf vb.net-Ebene wie

    Developement schrieb:

    HTML-Quellcode

    1. GeckoWebBrowser1.Navigate("javascript:void( document.getElementByClassName( 'icon icon-play toggle-play' ).click() ) ")
    . Da wie schon gesagt, dass sind keine Buttons, deswegen kann das nicht funktionieren.
    Bei den Maßen der Einfachheit stößt man an Grenzen, aber: "Es geht immer komplizierter".