Problem mit String Übergabe an TextBox (Webbrowser)



  • Hallöchen Community! 🙂

    Vorweg:
    -Es ist das erste Mal, dass ich mit Webseiten im Code hantieren muss 🙄
    -Ich möchte vorerst lieber Denkanstöße, dass ich möglicherweise selber auf die Lösung komme

    Ich hab das Problem einer TextBox im Webbrowser einen String zu übergeben. Normalerweise funktioniert das mit InnerText = string x... (zumindest in den Tutorial-Programmen wie z.B. http://www.sempervideo.de/?p=822 etc.)

    Die Website ist http://www.deine-berge.de/Rechner/Koordinaten.
    Hier möchte ich auf die TextBox unter "Suche nach Adresse, Ort..." zugreifen.
    Der Quellcode der Box ist

    <input type="text" id="adresse" class="adresse" style="width:370px;" value="" placeholder="Adresse, Ort oder POI eingeben"/>
    <img src="http://www.deine-berge.de/images/rechner_22.png" alt="umrechnen" id="calc_adresse" style="cursor:pointer;"/>
    <input type="text" id="utm_n" class="utm" style="width:125px;"/>
    

    id="adresse"
    id="calc_adresse"
    id="utm_n"

    Also schreibe ich:

    /*Sind mehrere Daten aus Tabelle, deswegen hier "Musteradresse"*/
    string s = "Deutschland, 12345, Musterstadt, Musterstraße"; /*(+ggf Hausnummer)*/
    webBrowser1.Document.GetElementById("adresse").InnerText = s;
    //webBrowser1.Document.GetElementById("utm_z"):SetAttribute("adresse", s);
    //webBrowser1.Document.GetElementById("utm_e").OuterText = s;
    
    webBrowser1.Document.GetElementById("calc_adresse").InvokeMember("click");
    
    string text = webBrowser1.Document.GetElementById("utm_n").InnerText;
    //string text1 = webBrowser1.Document.GetElementById("utm_n").GetAttribute("utm_z");
    //string text2 = webBrowser1.Document.GetElementById("utm_n").OuterText;
    

    Mein Ziel ist es, die UTM Koordinaten auszulesen, doch es funktioniert nichts.
    Habe mir etliche VB/C# Tutorials dazu reingezwungen, doch bin auf keine andere Lösung gekommen, wo liegt der Fehler?

    Bin dankbar für jede Hilfe 🙂

    MfG Stryke



  • Mit InnerText oder InnerHTML setzt man normalerweise den Inhalt eines HTML-Elements.

    z.B.:
    <input type="text" id="bla" value="tralalala">xxx</input>
    
    // ..("bla").InnerText ergibt "xxx" (allerdings haben "input"-Elemente üblicherweise kein "xxx")
    // ...an "tralalala" kommt man z.B. via ...("bla").GetAttribute("value").
    // Setzen entsprechend über SetAttribute()
    

    (Wichtig wäre natürlich auch, erst auf die Elemente zuzugreifen wenn die Seite auch fertig geladen ist)



  • Hi Geeky,
    Danke erstmal 🙂

    Also den Text einzufügen aus dem String hat jetzt doch mit

    webBrowser1.Document.GetElementById("adresse").InnerText = s;
    

    funktioniert nach einem Neustart des Rechners 🙄 (Warum auch immer, ist nicht das erste Mal 😡 )

    Das Problem ist jetzt, dass der Calc Button nicht geclicked wird durch:

    webBrowser1.Document.GetElementById("calc_adresse").InvokeMember("click");
    

    bei diesem HTML-Code:

    <img src="http://www.deine-berge.de/images/rechner_22.png" alt="umrechnen" id="calc_adresse" style="cursor:pointer;"/>
    

    geeky schrieb:

    (Wichtig wäre natürlich auch, erst auf die Elemente zuzugreifen wenn die Seite auch fertig geladen ist)

    Dafür habe ich folgenden Code aus einem Tutorial:

    while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                {
                    this.Name = "Lädt...";
                    System.Windows.Forms.Application.DoEvents();
                }
    
                webBrowser1.Refresh();
    

    Obwohl ich denke, dass man das webBrowser1.Refresh(); auch weglassen kann oder?

    Schöne Grüße,

    Stryke



  • Wieder eines dieser tollen Tutorials 👎

    Nimm besser das WebBrowser.DocumentCompleted Event!



  • Th69 schrieb:

    Nimm besser das WebBrowser.DocumentCompleted Event!

    Danke, läuft auch nen merklichen Tucken schneller 👍 😃

    Ist nur leider immer noch das Problem mit dem Button 😕 Bin hier schon halb am verzweifeln 😕



  • Steckt das nicht in ner <form> die man submitten könnten?



  • Grüße,
    hoffe, ihr hattest ein schönes Osterfest. 🙂

    In der Form befindet sich für den Rechner folgende Codezeile:

    <li id="sk_37" title="Rechner"  class="selected"  style="background-image:url(http://www.deine-berge.de/images/rechner_22.png);"><span>Rechner</span></li>
    

    aber diese lässt sich leider auch nicht durch "InvokeMember" drücken.

    Oder meinst du etwas ganz anderes?

    LG Stryke

    EDIT:
    Mir ist aufgefallen, dass ich die Button in meinem Webbrowser, wenn die Seite geladen ist, nicht mal anklicken kann, woran könnte das liegen?

    EDIT2:
    Buttons außerhalb des "Koordinatenrechners" können gedrückt werden



  • Ok, das Problem ist die Ausführung des Javascripts, aber ich weiß nicht wirklich, wie ich das Problem beheben soll.
    Im Internet ist immer folgende Lösung angegeben:

    using MSHTML;
    
    public static void ExecuteJavaScript(WebBrowser browser, string Script, string FunctionName, object[] Params)
                {
                    HtmlElement head = browser.Document.GetElementsByTagName("head")[0];
                    HtmlElement scriptEl = browser.Document.CreateElement("script");
                    IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
                    element.text = Script;
                    head.AppendChild(scriptEl);
                    browser.Document.InvokeScript(FunctionName, Params);
                }
    

    Aufrufen würde ich die Funktion wie folgt:

    ExecuteJavaScript(ExecuteJavaScript(webBrowser1, "text/javascript", "function", object[] Params)
    

    Ich weiß nur nicht, was ich obeject[] Params übergeben soll 😕



  • xStrykex schrieb:

    Mir ist aufgefallen, dass ich die Button in meinem Webbrowser, wenn die Seite geladen ist, nicht mal anklicken kann, woran könnte das liegen?

    An Skriptfehlern oder Elementen die über den Schaltflächen liegen.

    Mit <form> meine ich, das man üblicherweise sowas hat:

    <form id="eineform" action="script.php" method="post">
       <input type="text" name=".." ..../>
       <input type="submit" value="Absenden" />
    </form>
    

    ...und man statt den Button anzuklicken auch 'eineform' absenden könnte (was häufig den gleichen Effekt hat)

    Für Params müssen die Parameter der "function" (die in der Webseite bereits existieren muss oder im "Script"-Parameter steht) übergeben werden. Wenn die Funktion parameterlos ist, einfach ein leeres object-Array übergeben.
    Ein Aufruf könnte z.B. so aussehen:

    // Dieser JS-Code wird quasi durch ExecuteJavaScript() in die Webseite injiziert:
    StringBuilder js=new StringBuilder();
    js.AppendLine("function hallo()");
    js.AppendLine("{");
    js.AppendLine("   alert('hallo!');");
    js.AppendLine("}");
    string jsCode=js.ToString();
    
    ExecuteJavaScript(ctrl, jsCode, "hallo", new object[0]);
    


  • Danke geeky 🙂

    Eine Form gibt es da leider nicht, bzw lässt sich nicht so ansprechen, wie du es geschrieben hast 😕
    Das mit den Javascripts ist doch echt nervig 😡

    Das mit den Parametern hat allerdings geklappt bei einem anderen Programm, vielen Dank dafür 😉

    Habe nun nach langer Suche zufällig eine API gefunden, mit der ich dem Ziel einen guten Schritt näher gekommen bin 👍

    Habe dort jetzt zwar ebenfalls ein problem, aber versuche es erstmal selbst zu lösen (auch wenn ich denke alles schon versucht zu haben^^)

    Bis dahin schöne Grüße,

    Stryke


Anmelden zum Antworten