none
Link in IFrame auswählen/anklicken RRS feed

  • Frage

  • Hallo zusammen,
    ich schreibe ein Programm um den Internetexplorer zu steuern. Funktioniert soweit auch ganz gut.

    Jetzt suche ich nach einer Methode Links in einem IFrame zu finden/Anzuklicken
    Das habe ich mit VBA geschafft, allerdings weiß ich nicht, wie ich es nach c# umsetzen soll.

    Ich starte einen neuen Browser und navigiere zur URL;

    mit:

    wb.document.USER.value = "Username";
    wb.document.PASSWORD.value = "Password";

    Fülle ich die Felder und hole mir dann das Element vom Loginbutton.
    Nach dem Login gibt es ein Eingabe Feld, wenn ich das Fülle, erscheint ein IFrame mit je nach Eingabe verschiedener Anzahl an Links.
    Ich habe mit der URL von dem Javascript bereits auslesen können, welchen Link ich benötige.
    Aber ich schaffe es nicht ihn anzuwählen.
    Mit VBA habe ich es geschafft. So sieht der Befehl in VBA aus:

    Call IEDocument.iframe.execScript("Choose('Objektnummer,Referenznummer')", "JavaScript")


    und mit

    var mydoc = wb.document;
    var links = mydoc.links;
    for each ((HTMLELEMENT)link in links)...bekomme ich die Links die sich auf der Website befinden, aber nicht die in dem IFrame

    Habe die Suche bereits bemüht, bekomme da ähnliche Vorschläge wie oben und komme nie auf den Iframe

    Hier ist der iframe code:
    <tr> <td colspan='2' nowrap="nowrap"> <a href="java script:choose('Objektnummer, Referenznummer')">Objektname</a> </td> </tr>
    <tr> <td colspan='2' nowrap="nowrap"> <a href="java script:choose('Objektnummer2, Referenznummer2')">Objektname2</a> </td> </tr>

    Hoffe ich konnte meine Frage verständlich formulieren, wenn nicht mach ich noch ein Beispielbild rein
    Vielen Dank im Voraus
    • Bearbeitet Speedgaming Freitag, 6. Dezember 2019 16:30
    Freitag, 6. Dezember 2019 16:29

Alle Antworten

  • Hallo Speedgaming,

    Hast Du es mit der Methode GetElementsByTagName (einmal mit "iframe" als Parameter und danach mit "a") oder GetElementById (wenn das ID-Attribut bekannt ist) und anschließend mit GetAttribute("href") versucht, um auf die URL zu kommen? Beispielcodes findest Du in diesen Threads:
    How to obtain entire text content of a web page displayed in iframe named 'test_iframe' in Visual Basic 2010
    Simulate pressing on link in WebBrowser

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 9. Dezember 2019 14:37
    Administrator
  • Hallo Dimitar,

    habe deinen Vorschlag heute probiert. Leider ohne Erfolg. 

    var idoc = (HTMLDocument)wb.Document;
    var childiframe = idoc.getElementById("IFRAME"); 
    var iframedoc = childiframe.document;
    HTMLElementCollection col = iframedoc.GetElementsByTagName("a");
    foreach (HTMLHtmlElement el in col)
    {
    if (el.getAttribute("href").Contains("javascript:choose('Objektnummer,Referenznummer')"))
        {
          el.click();
        }
    }

    Bekomme aber für die Zeile:

    HTMLElementCollection col = iframedoc.GetElementsByTagName("a");

    den Fehler: 

    Das Com-Objekt des Types "System._ComObject" kann nicht in den Schnittstellentyp "mshtml.HTMLElementCollection" umgewandelt werden. Dieser Vorgang konnte nicht durchgeführt werden da der QueryInterface-Aufruf an die Com-Komponente für die Schnittstelle mit der IID "{...]" aufgrund des folgenden Fehlers nicht durchgeführt werden konnte: Schnittstelle nicht unterstützt



    • Bearbeitet Speedgaming Mittwoch, 11. Dezember 2019 09:19
    Mittwoch, 11. Dezember 2019 09:18
  • Hallo Speedgaming,

    Es scheint, dass dies mit JavaScript bewerkstelligt werden kann. Sieh Dir diesbezüglich folgenden Thread an:
    Using document.getElementsByTagName on a page with iFrames - elements inside the iframe are not being picked up

    JavaScript-Funktionen können mithilfe von InvokeScript (siehe unten) aufgerufen werden und hoffentlich ist dies auch auf das obige Beispiel anwendbar (ich wage es nicht mit Sicherheit zu behaupten, da ich mit JavaScript in Verbindung mit einem WebBrowser-Steuerelement keine Erfahrung habe).
    Calling a Javascript function in the C# webBrowser control

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 13. Dezember 2019 12:51
    Administrator
  • Ich habe das ganze jetzt mal versucht, verstehe leider aber nicht wie das Script aussieht, das ich ausführen möchte.

    was hier von ist den mein Script?:<tr> <td colspan='2' nowrap="nowrap"> <a href="java script:choose('Objektnummer, Referenznummer')">Objektname</a> </td> </tr>

    könnte das hier richtig sein?

                        wb.Document.InvokeScript("javascript:choose('Objektnummer,Referenznummer')");

    Wenn ja bekomme ich hier die Fehlermeldung 

    "mshtml.HTMLDocumentClass enthält keine Definition für InvokeScript"

    jemand noch eine Idee oder Ansatz?

    Ich befürchte das viel größere Problem ist, dass ich nicht auf den Inhalt von dem IFrame zugreifen kann. 

    Ich bekomme mit keiner Methode Elemente aus dem IFrame, sonder nur aus den restlichen teilen des HTMLDocument, weil der IFrame zwar die gleiche domain aber ein anderes TOP Element ist. 

    Weiß jemand wie ich auf das zweite TOP Element zugreifen kann?

    Die Elemente aus dem "ersten" Top bekomme ich alle.

    DomainAufbau:

    Top

         URL

                HTMLDocument1

    IFRAME

         URL

                HTMLDocument2

    Hoffe man versteht was ich zeigen möchte, ich darf leider keine Bilder hier einfügen

    • Bearbeitet Speedgaming Montag, 16. Dezember 2019 18:16
    Montag, 16. Dezember 2019 16:09
  • Den weg habe ich ebenfalls probiert, aber bei
    contentDocument oder contentWindow
    bekomme ich die Meldung:
    IHTMLElement' does not contain a definition for 'contentWindow' and no accessible extension method 'contentWindow' accepting a first argument of type 'IHTMLElement' could be found (are you missing a using directive or an assembly reference?)

    Wüsste aber nicht, was ich noch hinzufügen muss als reference, damit es funktioniert.
    Die HTML Object Library und Internet Controls habe ich bereits aktiviert. Und eine Reference mit DOM oder Window habe ich nicht gefunden.
    Mittwoch, 18. Dezember 2019 10:28