Fragensteller
Link in IFrame auswählen/anklicken

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
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 WebBrowserGruß,
DimitarBitte 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.
-
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
-
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 upJavaScript-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 controlGruß,
DimitarBitte 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.
-
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
-
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.