Function im WebBrowser aufrufen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Kraizy.

    Function im WebBrowser aufrufen

    Hallo,

    ich habe z.B. eine Seite namens test.de/abc.js mit folgendem Inhalt:

    PHP-Quellcode

    1. function test(a){return a * 2}


    Wie kann ich diese Funktion nun in einem WebBrowser ausführen lassen und das Ergebnis in einer Variable speichern?
    Habe es schon auf zwei Arten versucht, jedoch beide ohne Erfolg:

    VB.NET-Quellcode

    1. WebBrowser.DocumentText = *Seitenquelltext der abc.js*
    2. '1. Versuch
    3. Dim i As Integer = WebBrowser.Document.InvokeScript("test", {5})
    4. '2. Versuch
    5. Dim i As Integer = WebBrowser.Document.Window.DomWindow.execscript("test(5)", "JavaScript")


    Beim 1. Versuch bekomme ich immer 0 raus, beim 2. Versuch kommt folgender Skriptfehler:


    Der Wert der Eigenschaft "test" ist Null oder undefiniert, kein Function-Objekt
    Ist ziemlich lange her, dass ich den WebBrowser benutzt habe. Wo liegt Dein Problem ?

    Einfache WebSeite mit Javascript Function:
    "HTML"

    HTML-Quellcode

    1. <html>
    2. <head>
    3. <title>JavaScript-Test</title>
    4. <script language="JavaScript">
    5. <!--
    6. function Quadrat(Zahl)
    7. {
    8. Ergebnis = Zahl * Zahl;
    9. return Ergebnis;
    10. }
    11. //-->
    12. </script>
    13. </head>
    14. <body>
    15. </body>
    16. </html>


    "VB Code"

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Dim doc As HtmlDocument = WebBrowser1.Document
    5. Dim o As Object = doc.InvokeScript("Quadrat", {27})
    6. MessageBox.Show(CStr(o))
    7. End Sub
    8. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    9. WebBrowser1.Navigate("D:\Test.html")
    10. End Sub
    11. End Class


    Funktioniert problemlos. Und wie immer der Rat Option Strict ON
    Die Seite entählt kein HTML-Code und auch kein


    <script language="JavaScript">

    Da ist lediglich die Funktion selbst, mehr nicht. Und diese kann ich im WebBrowser nicht aufrufen.
    Option Strict On nutze ich, habe es bloß in meinem Post weggelassen, da ich es nochmal neu abgetippt hab aus dem Kopf

    Kraizy schrieb:

    Da ist lediglich die Funktion selbst, mehr nicht. Und diese kann ich im WebBrowser nicht aufrufen.

    Dann poste doch mal nicht nur eine technische Frage, sondern beschreibe den Sinn Deines Projektes. Dann können wir Dir besser helfen.

    Frei nach dem Motto: "Ich habe eine Problem, ratet mal welches ... "
    Also willst du eine Art JavaScript-Parser. Du könntest mit nem Webclient die JS-Datei runterladen, da dieses oben gepostete HTML-Zeug codeseitig dranbasteln, im Temp speichern und mit deinem Webbrowser aufrufen.
    Schöner gehts jedoch mit der JavaScript .NET-Bibliothek. Hier ist es (zwar in C#, aber das ist fast (nicht syntaktisch) das selbe und lässt sich konvertieren) beschrieben, wie es gehen könnte.
    @Kangaroo
    Naja eig habe ich ja schon gesagt, was ich machen will.
    Ich arbeite zurzeit an einem kleinen Tool welches mit einer Seite über WebRequests kommuniziert. Jedoch habe ich das Problem, dass beim POST ein Parameter verschlüsselt übergeben wird. Und die Funktion zum Verschlüsseln ist in der domain.de/blabla.js. Dort ist folgender Inhalt (kein HTML-Zeug usw):

    PHP-Quellcode

    1. var answer=md5(userInput.Value)
    2. function md5(str){
    3. ...
    4. }
    5. function md5_1(a, b, c, d, x){
    6. ...
    7. }
    8. ...


    In der Funktion md5() selbst werden nochmal einige Funktionen aufgerufen um eben den Parameter "answer" besser zu verschlüsseln.
    Das ganze sieht dann ca so aus:

    PHP-Quellcode

    1. function md5(str){
    2. x=chunkMessage(str)
    3. a=152652343;
    4. b=-22544336;
    5. c=-184649053;
    6. d=2857483285;
    7. a=md5_1(a, b, c, d, x)
    8. b=md5_1(a, b, c, d, x)
    9. ...
    10. a=md5_2(a, b, c, d, x)
    11. b=md5_2(a, b, c, d, x)
    12. ...
    13. //noch einige mal mehr...
    14. return numToHex(a)+numToHex(b)+numToHex(c)+numToHex(d)
    15. }

    Da werden noch einige weitere Funktionen aufgerufen (habe jetzt nicht alle aufgeschrieben, aber sollte ja trotzdem verständlich sein was da passiert), die auch alle im Quelltext zu finden sind, nur weiß ich nicht, wie ich die Funktion "md5" aufrufen kann, damit ich dann den verschlüsselten Wert erhalte und mein HttpPost weiter zusammenbauen und abschicken kann. Ich denke ich könnte auch die einzelnen Funktionen nachbilden, aber das würde wohl einige Zeit in Anspruch nehmen, deshalb dachte ich, ich könnte es einfach im WebBrowser aufrufen und den Wert abspeichern..

    @Myrax Danke, werde das mal versuchen

    Kraizy schrieb:

    Naja eig habe ich ja schon gesagt, was ich machen will.
    Jetzt hast Du.

    Du schreibst selber, die MD5 Function benötigt andere Funktionen aus dem .js File, also ist das schon etwas mehr. Ich habe mich noch nicht damit beschäftigt, aber meine erste Suche wäre im .NET ASP Bereich oder im Microsoft.JScript Namespace.

    Edit: z.B. das hier Evaluating JavaScript code from C#

    Wenn es nur um das Login geht: dann könntest Du den auch mit dem WebBrowser vollziehen und dann das Cookie rüberkopieren.
    Habe es nun einfach so gemacht, dass ich alle Funktionen, die die md5() nutzt in eine .js Datei gepackt hab, welche sich auf meinem Webspace befindet und anschließend ein GET Request an meine PHP abschicke, welche im Endeffekt die js Funktion aufruft und den verschlüsselten Wert returned (somit fällt auch der WebBrowser komplett weg). Denke mal das Problem hat sich nun gelöst. Danke an alle.