CefSharp Browser (Chromium) führt JS Script bei Aufruf nicht aus

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Fluffing.

    CefSharp Browser (Chromium) führt JS Script bei Aufruf nicht aus

    Hallo,

    ich bräuchte nochmal eure Hilfe. Und zwar habe ich mir eine HTML Datei geschrieben, welche auch JS nutzt. Diese möchte ich dann durch den Webbrowser öffnen. Dann kommt allerdings der Fehler, dass Scripte nicht geladen werden konnten. Durch etwas recherche habe ich herausgefunden, dass man separate Scripte wohl manuell ausführen muss. Da komme ich allerdings nicht ganz weiter.
    Versucht habe ich das ganze mit diesem Link:
    dotnet-snippets.de/snippet/jav…r-control-ausfuehren/2764

    Meine HTML sieht so aus:

    HTML-Quellcode

    1. <html><head><script src="https://api.mqcdn.com/sdk/mapquest-js/v1.3.2/mapquest.js"></script>
    2. <link type="text/css" rel="stylesheet" href="https://api.mqcdn.com/sdk/mapquest-js/v1.3.2/mapquest.css"/>
    3. <script type="text/javascript">
    4. window.onload = function() {
    5. L.mapquest.key = 'lYrP4vF3Uk5zgTiGGuEzQGwGIVDGuy24';
    6. var map = L.mapquest.map('map', {
    7. center: [51.8977926093725, 8.386069634439036],
    8. layers: L.mapquest.tileLayer('map'),
    9. zoom: 12
    10. });map.addControl(L.mapquest.control());
    11. }
    12. </script>
    13. </head>
    14. <body style="border: 0; margin: 0;"></body>
    15. </html>


    Und im Code habe ich dann folgendes eingegeben:

    VB.NET-Quellcode

    1. Private Sub karte_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. WebBrowser1.Navigate(Application.StartupPath + "/Test.htm")
    3. ExecuteJavaScript(WebBrowser1, Application.StartupPath + "/Test.htm", "function", "")
    4. End Sub
    5. Public Shared Sub ExecuteJavaScript(ByVal browser As WebBrowser, ByVal Script As String, ByVal FunctionName As String, ByVal Params As Object())
    6. Dim head As HtmlElement = browser.Document.GetElementsByTagName("head")(0)
    7. Dim scriptEl As HtmlElement = browser.Document.CreateElement("script")
    8. Dim element As IHTMLScriptElement = CType(scriptEl.DomElement, IHTMLScriptElement)
    9. element.text = Script
    10. head.AppendChild(scriptEl)
    11. browser.Document.InvokeScript(FunctionName, Params)
    12. End Sub


    Allerdings weiß ich ab dann nicht mehr, was ich falsch mache. Ich weiß auch nicht, welche Parameter ich dort genau angeben soll...? Bzw. ob der Rest überhaupt so richtig ist.
    Die Funktion in der HTML ist immer die gleiche. Wie bekomme ich es also hin diese HTML zu laden? Und ergänzend: Process kommt nicht in Frage, da nicht ständig neue Tabseiten geöffnet werden sollen.

    Kann mir da jemand weiter helfen?

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Okay, was soll denn passieren?
    Fehlt deinem HTML / JS oben etwas?

    Ich erhalte in der Developer Console des Chrome

    Quellcode

    1. ​Uncaught Error: Map container not found.
    2. at e._initContainer (mapquest.js:10:40745)
    3. at e.initialize (mapquest.js:10:29762)
    4. at e [as constructor] (mapquest.js:10:14905)
    5. at new e (mapquest.js:10:195853)
    6. at Object.l [as map] (mapquest.js:10:195518)
    7. at window.onload (test.html:6:28)
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Durch ein <div id="map"></div> im Body kommt der Fehler nicht mehr (gefunden hier: groups.google.com/g/leaflet-js/c/7ijJjfhB6mQ?pli=1). Allerdings kommt dann The AppKey submitted with this request is invalid..
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Mal davon ab, dass dein JS aus Post 1 nicht lauffähig ist, steht doch im Link was du tun musst.
    Nur das in dem Beispiel, das Script nicht von der Website genutzt wird, sondern im Head Bereich ein neues Script Tag erzeugt wird und das Script angehangen. Das könnte bei dir ja entfallen.

    Was du willst, ist die Zeile
    browser.Document.InvokeScript(FunctionName)

    Dazu änderst du in deinem JS die Function so, dass sie einen eindeutigen Bezeichnet bekommt und nicht mehr im Window.onload geladen wird.

    Da deine Function ohne Parameter auskommt, sollte ein leerer String reichen. Bzw. Vielleicht sind Params eine Überladung die weggelassen werden kann.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Also so genau verstehe ich das jetzt nicht. Aus der oben genannten Datei erstelle ich mir auf dem Desktop eine .htm Datei. Wenn ich diese ausführe, dann wird diese ganz normal geöffnet und eine OSM Karte wird angezeigt. Kenne mich leider auch kaum mit HTML und JS aus. Dafür ist das zu lange her, das ich das mal gelernt habe.

    @MrTrebron Ich kann aber die Funktion auch nicht einfach so abändern, da diese von der Website (MapQuest) fest vorgeben ist. Zumindest wenn ich den Namen ändere, dann funktioniert das ganze nicht mehr. Dann wird mir nur noch ein weißes Fenster angezeigt. Mit InvokeScript("function") wird auch nur ein weißes Fenster anzeigt aber kein Scriptfehler mehr erzeugt.

    @Marcus Gräfe Das mit dem Key kann normal sein. Das ist der Key der auf der Website aufgeführt ist. Wenn man das extern ausführt, dann braucht man denke ich mal seinen eigenen. Aber da kenne ich mich wie gesagt nicht genug aus. Ich habe meinen Key mit dem die HTML so funktioniert, wie hier drüber beschrieben.
    Du sollst die Function auch nicht ändern, sondern einen Namen geben.

    Wie schon erwähnt, funktioniert aber auch schon der Aufruf in HTML / JS nicht
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    @MrTrebron Ich habe der Funktion jetzt den Namen erstelleKarte gegeben und das onload entfernt. Ist das so richtig?

    HTML-Quellcode

    1. <html><head><script src="https://api.mqcdn.com/sdk/mapquest-js/v1.3.2/mapquest.js"></script>
    2. <link type="text/css" rel="stylesheet" href="https://api.mqcdn.com/sdk/mapquest-js/v1.3.2/mapquest.css"/>
    3. <script type="text/javascript">
    4. function erstelleKarte() {
    5. L.mapquest.key = 'lYrP4vF3Uk5zgTiGGuEzQGwGIVDGuy24';
    6. var map = L.mapquest.map('map', {
    7. center: [51.8977926093725, 8.386069634439036],
    8. layers: L.mapquest.tileLayer('map'),
    9. zoom: 12
    10. });map.addControl(L.mapquest.control());
    11. }
    12. </script>
    13. </head>
    14. <body style="border: 0; margin: 0;"></body>
    15. </html>



    Aber warum die HTML nicht funktioniert verstehe ich nicht. Was muss ich denn dort ändern? Ich lade meine Datei mal hier hoch, die funktioniert ja irgendwie.
    Dateien
    • Test2.htm

      (803 Byte, 76 mal heruntergeladen, zuletzt: )
    Jetzt wird deine Function nicht mehr automatisch aufgerufen.
    Möchtest du das Lokal weiterhin sehen, dann wieder ein window.onload = erstelleKarte()

    Aber erstelleKarte wäre jetzt das was im Invoke passieren sollte.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    @MrTrebron Den Invoke rufe ich auch so auf. Allerdings bleibt das Fenster vom Webbrowser leider weiß!
    Und jetzt kommt auch wieder die Fehlermeldung: ScriptError

    VB.NET-Quellcode

    1. ​WebBrowser1.Navigate(Application.StartupPath + "/Test3.htm")
    2. WebBrowser1.DocumentText = My.Computer.FileSystem.ReadAllText(Application.StartupPath + "/Test3.htm")
    3. WebBrowser1.Document.InvokeScript("erstelleKarte")
    Wie es aussieht, gibt es da zwei Probleme.
    Zum einen mag das WebBrowser Control kein Nachladen von JavaScript aus externen Quellen.
    Zum anderen rendert es auch nicht den Inhalt wenn ich das externe JS mal in die Datei mit rein packe.
    Scheint aber ein allgemeines Problem mit dem Control zu sein
    Webbrowser Control mit Javascript
    weblog.west-wind.com/posts/201…Specifying-the-IE-Version
    stackoverflow.com/questions/25…-windows-form-web-browser

    Die Registry Variante habe ich bei mir jetzt nicht ausprobiert, der META-Tag löst bei mir das Problem auch nicht.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.

    MrTrebron schrieb:


    Scheint aber ein allgemeines Problem mit dem Control zu sein.


    Die Themen und Threads hatte ich mir vor meinem Beitrag leider alle schon durchgelesen, ohne Erfolg.

    Kennst du denn noch eine andere Möglichkeit eine HTML bzw. JS darzustellen, welche kein Webbrowser benötigt? Process möchte ich ungerne verwenden, da dadurch immer wieder neue Tabs geöffnet werden. Und ich möchte das eigentlich immer im selben Tab angezeigt bekommen.
    Du könntest noch die Registry Keys probieren.
    Wobei es dann wohl nicht während des Debugging im VS geht.

    Ansonsten wäre da Chromium. Einfach Mal hier im Forum suchen. CefSharp wäre da wohl das Stichwort.

    Ich hätte noch einen Ansatz für das WebBrowser Control, aber bei mir aktualisiert sich gerade das Visual Studio. Würde dem morgen noch mal nachgehen wollen.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MrTrebron“ ()

    Ah, Chromium hat mir schon sehr gut weiter geholfen, Danke! Da funktioniert jetzt alles, so wie ich mir das vorgestellt habe. Das Panel hat zwar schwarze Ränder aber damit kann ich leben.

    Aber vielleicht funktioniert dein Ansatz ja auch noch :)
    Na leider kein Erfolg.
    Immer wenn es ums Nachladen aus externer Quelle geht, mag das Control nicht mehr.
    War auf dies hier
    stackoverflow.com/questions/41…t-in-a-webbrowser-control
    gestoßen, aber der Eintrag ist ja auch schon älter.

    Dann gibt es noch WebView2, docs.microsoft.com/de-de/microsoft-edge/webview2/
    aber da mag bei mir noch nicht Mal das grundlegende Demo.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    @MrTrebron Obwohl, eine Frage hätte ich da nochmal. Wie auch beim Webbrowser, möchte ich auch hier die InvokeScript Funktion aufrufen. Allerdings passiert dort wieder nichts.
    Wenn ich das ganze aber auf der Testseite von MapQuest ausführe, dann geht das ohne Probleme. Mache ich schon wieder etwas falsch? Die ExecuteScriptWhenPageLoaded habe ich mal ignoriert, da auf der Seite ja kaum etwas geladen wird und ich mit dem drücken vom Button warte. Ich habe auch das Funktion ViewSource mal ausgeführt. Die Funktionen stehen dort alle drin. Deswegen verstehe ich nicht so ganz warum er sie nicht ausführt. Und wie kann ich der Funktion dann noch neue Parameter für Koordinaten und Text mitgeben?

    HTML-Quellcode

    1. <html>
    2. <head>
    3. <script src="https://api.mqcdn.com/sdk/mapquest-js/v1.3.2/mapquest.js"></script>
    4. <link type="text/css" rel="stylesheet" href="https://api.mqcdn.com/sdk/mapquest-js/v1.3.2/mapquest.css"/>
    5. <script type="text/javascript">
    6. window.onload = function() {
    7. L.mapquest.key = 'lYrP4vF3Uk5zgTiGGuEzQGwGIVDGuy24';
    8. map = L.mapquest.map('map', {
    9. center: [51.8977926093725, 8.386069634439036],
    10. layers: L.mapquest.tileLayer('map'),
    11. zoom: 12
    12. });
    13. layerGroupFahrzeuge = L.layerGroup().addTo(map);
    14. layerGroupNotruf = L.layerGroup().addTo(map);
    15. map.addControl(L.mapquest.control());
    16. if (document.getElementById("button")) {
    17. // Der ID den Event-Handler 'click' hinzufügen,
    18. // als Event die Funktion 'test' aufrufen.
    19. document.getElementById("button").addEventListener("click", erstelleMarker);
    20. }
    21. if (document.getElementById("button2")) {
    22. // Der ID den Event-Handler 'click' hinzufügen,
    23. // als Event die Funktion 'test' aufrufen.
    24. document.getElementById("button2").addEventListener("click", test);
    25. }
    26. if (document.getElementById("button3")) {
    27. // Der ID den Event-Handler 'click' hinzufügen,
    28. // als Event die Funktion 'test' aufrufen.
    29. document.getElementById("button3").addEventListener("click", erstelleNotruf);
    30. }
    31. }
    32. function erstelleMarker(){
    33. L.mapquest.textMarker([51.8977926093725, 8.386069634439036], {
    34. text: 'Test',
    35. subtext: '',
    36. position: 'right',
    37. type: 'marker',
    38. icon: {
    39. primaryColor: '#0000FF',
    40. secondaryColor: '#FFFFFF',
    41. size: 'sm'
    42. }
    43. }).addTo(layerGroupFahrzeuge);
    44. }
    45. function erstelleNotruf(){
    46. L.mapquest.textMarker([51.8477926093725, 8.386069634439036], {
    47. text: 'Notruf',
    48. subtext: '',
    49. position: 'right',
    50. type: 'marker',
    51. icon: {
    52. primaryColor: '#FF0000',
    53. secondaryColor: '#FFFFFF',
    54. size: 'sm'
    55. }
    56. }).addTo(layerGroupNotruf);
    57. }
    58. function test() {
    59. layerGroupFahrzeuge.clearLayers();
    60. }
    61. </script>
    62. </head>
    63. <body style="border: 0; margin: 0;">
    64. <button type="button" id="button">Marker erstellen!</button>
    65. <button type="button" id="button2">Marker entfernen!</button>
    66. <button type="button" id="button3">Notruf erstellen!</button>
    67. <div id="map" style="width: 100%; height: 530px;"></div>
    68. </body>
    69. </html>


    Meine VB.net Code

    VB.NET-Quellcode

    1. Try
    2. browser.ExecuteScriptAsync("erstelleMarker")
    3. Catch ex As Exception
    4. MessageBox.Show(ex.Message)
    5. End Try


    und hier die Testseite auf der es funktioniert (allerdings mit erstellten Buttons die die Funktion aufrufen)
    developer.mapquest.com/documen…/v1.3/examples/basic-map/
    Dateien
    • Test3.htm

      (2,85 kB, 92 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Fluffing“ ()

    Da muss ich leider passen.

    Es würde anderen aber helfen, wenn du schreibst, welche Komponente du jetzt wie zur Anzeige des HTML hernimmst.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Okay schade. Aber trotzdem Danke!

    Vielleicht kann mir ja jemand Anderes helfen. Ich benutze aktuell den Chromium Browser und möchte dort einzelne Funktionen aufrufen, wie in meinem Post hier rüber geschrieben. Den HTML-Text speichere ich als .htm Datei ab und Lade durch browser.Load() hinein. Ab dann weiß ich leider nicht mehr weiter. ExecuteScriptAsync führt auf Aufruf nichts aus. Warum ist das so und wie kann ich das beheben?

    Wenn ich diesen Code ausführe, dann erscheint ein leeres Fenster ohne irgendeine Fehlermeldung. Wenn ich testweise einen Buchstaben aus der Funktion lösche, dann sagt das System sofort, dass die Funktion nicht gefunden wurde.

    VB.NET-Quellcode

    1. browser.GetMainFrame().EvaluateScriptAsync("erstelleMarker").Result.Message


    EDIT: Habe es herausgefunden:

    VB.NET-Quellcode

    1. ​ browser.ExecuteScriptAsync("
    2. L.mapquest.textMarker([51.8977926093725, 8.386069634439036], {
    3. text: 'Test',
    4. subtext: '',
    5. position: 'right',
    6. type: 'marker',
    7. icon: {
    8. primaryColor: '#0000FF',
    9. secondaryColor: '#FFFFFF',
    10. size: 'sm'
    11. }
    12. }).addTo(layerGroupFahrzeuge);
    13. ")

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