2016-11-30 4 views

Antwort

3

Sie beliebige JavaScript ausführen können mit js, document.documentElement.outerHTML den aktuellen DOM zurückkehren, so

let html = js "return document.documentElement.outerHTML" |> string 

funktioniert der Trick.

+0

Während Ihre Antwort aussieht und verhält sich viel versprechend, das Problem ist, dass es den erzeugten HTML-Code der Standard WebDriver Seite, das heißt „ WebDriver ˛ ...“ und nicht von der angegebenen URL zurückgibt, die scheint einige Zeit zu brauchen, um zu laden. Das Hinzufügen von 'Thread.Sleep' und Schleifen, um darauf zu warten, dass der Ziel-HTML-Code geladen wird, löst" NoSuchWindowException "aus. – bugfoot

+0

Leider gibt es keine (einzige) Lösung für dieses Problem. Im Allgemeinen können Sie nicht feststellen, ob eine Seite (einschließlich JavaScript) geladen/ausgeführt wurde oder ob einige Aktionen (z. B. über 'setTimeout') oder sogar nur unendliche Animationen warten. Wenn Sie die Seite kennen, können Sie auf einige Indikatoren warten: siehe 'waitFor',' waitForElement', z. 'waitFor (fun() -> js" zurück document.readyState "|> string =" complete ")' Wie auch immer, dies sollte eine separate Frage sein (die wahrscheinlich als Duplikat geschlossen wird). – CaringDev

+0

Tatsächlich habe ich die [erforderliche Konfiguration für IE] übersehen (https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver#required-configuration). Mit allem, was gesetzt ist, und Ihrem 'waitFor'-Code, kann es in der Tat den _generated_ HTML speichern. Vielen Dank :-) – bugfoot

3

Canopy ist ein Wrapper um Selen, der einige nützliche Hilfsfunktionen bietet. Aber es bietet auch Zugriff auf die Selenium IWebElement Instanzen für den Fall, dass Sie sie brauchen, über die element function (auf halbem Weg auf der Seite; es scheint nicht interne Anker auf dieser Seite, so konnte ich nicht direkt mit der Funktion verknüpfen). Dann, sobald Sie das IWebElement Objekt haben, wird Ihr Problem ähnlich wie this one, wo die Antwort scheint elem.getAttribute("innerHtml") wo elem ist das Elemem, dessen Inhalt Sie wollen (das könnte sogar die html Element sein). Beachten Sie, dass das innerHtml-Attribut nicht ein Standard-DOM-Attribut ist, so dass dies nicht mit allen Selenium-Treibern funktioniert; Es hängt davon ab, in welchem ​​Browser Sie laufen. Aber es funktioniert anscheinend in allen gängigen Webbrowsern.

Siehe Get HTML Source of WebElement in Selenium WebDriver using Python für eine verwandte Frage mit Python, die mehr Diskussion darüber hat, ob das innetHtml Attribut in allen Browsern funktioniert. Wenn nicht, Canopy auch hat die js Funktion, die Sie nutzen könnten, um einige Javascript zu starten, um die HTML, die Sie suchen - aber wenn Sie Probleme damit haben, müssen Sie wahrscheinlich eine fragen Javascript-Frage eher als eine F # -Frage.

+0

Wenn ich versuche, 'let html = element" html "|> string' hinzuzufügen, wird' NoSuchWindowException' ausgelöst, was merkwürdig ist, da auf der generierten HTML-Seite ein html-Element sein sollte. – bugfoot

+0

Was passiert, wenn Sie diese Seite in einem Browser laden und dann die Developer Tools öffnen, um sich deren Inhalt anzusehen? Hat es ein "html" -Element? – rmunn

+0

Warum machst du da auch '|> String? Die Idee ist, das 'IWebElement'-Objekt ** zu erhalten und seine Eigenschaften zu verwenden; es in eine Zeichenfolge umzuwandeln scheint kontraproduktiv. – rmunn

Verwandte Themen