Abrufen der HTML-Quelle von WebElement in Selenium WebDriver mithilfe von Python

476

Ich verwende die Python-Bindungen, um Selenium WebDriver auszuführen:

from selenium import webdriver
wd = webdriver.Firefox()

Ich weiß, dass ich mir so ein Webelement schnappen kann:

elem = wd.find_element_by_css_selector('#my-id')

Und ich weiß, dass ich mit ...

wd.page_source

Aber gibt es trotzdem die "Elementquelle"?

elem.source   # <-- returns the HTML as a string

Die Selenium-Webdriver-Dokumente für Python sind im Grunde nicht vorhanden, und ich sehe im Code nichts, was diese Funktionalität zu aktivieren scheint.

Irgendwelche Gedanken darüber, wie man am besten auf den HTML-Code eines Elements (und seiner untergeordneten Elemente) zugreifen kann?

Chris W.
quelle
8
Sie können auch alle wd.page_sourcemit beautifulsoup analysieren
eLRuLL

Antworten:

748

Sie können das innerHTMLAttribut lesen , um die Quelle des Inhalts des Elements abzurufen, oder die outerHTMLQuelle mit dem aktuellen Element.

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

C #:

element.GetAttribute("innerHTML");

Rubin:

element.attribute("innerHTML")

JS:

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

Getestet und arbeitet mit dem ChromeDriver.

Nerijus
quelle
9
innerHTML ist kein DOM-Attribut. Die obige Antwort würde also nicht funktionieren. innerHTML ist ein Javascript-Javascript-Wert. Wenn Sie dies oben tun, wird null zurückgegeben. Die Antwort von nilesh ist die richtige Antwort.
Bibstha
6
Das funktioniert gut für mich und ist viel eleganter als die akzeptierte Antwort. Ich benutze Selenium 2.24.1.
Ryan Shillington
22
Obwohl innerHTML kein DOM-Attribut ist, wird es von allen gängigen Browsern ( quirksmode.org/dom/w3c_html.html ) gut unterstützt . Es funktioniert auch gut für mich.
CuongHuyTo
3
+1 Dies scheint auch in Ruby zu funktionieren. Ich habe das Gefühl, dass die getAttributeMethode (oder eine Entsprechung in anderen Sprachen) nur die js-Methode aufruft, deren Name das Argument ist. In der Dokumentation wird dies jedoch nicht explizit angegeben, sodass die Lösung von nilesh ein Fallback sein sollte.
Kelvin
23
Dies schlägt fehl für HtmlUnitDriver. Arbeitet für ChromeDriver, FirefoxDriver, InternetExplorerDriver(IE10) und PhantomJSDriver(ich habe nicht andere getestet).
acdcjunior
91

Es gibt keine einfache Möglichkeit, den HTML-Quellcode von a abzurufen webelement. Sie müssen JS verwenden. Ich bin mir bei Python-Bindungen nicht sicher, aber Sie können dies problemlos in Java tun. Ich bin sicher, dass es JavascriptExecutorin Python etwas Ähnliches wie Klasse geben muss .

 WebElement element = driver.findElement(By.id("foo"));
 String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element); 
Nilesh
quelle
1
Dies ist im Wesentlichen das, was ich letztendlich getan habe, wenn auch mit dem Python-Äquivalent.
Chris W.
8
Ich denke, die Antwort unten mit element.getAttribute ("innerHTML") ist viel einfacher zu lesen. Ich verstehe nicht, warum die Leute es ablehnen.
Ryan Shillington
1
Sie müssen kein Javascript aufrufen. In Python verwenden Sie einfach element.get_attribute ('innerHTML')
Anthon
6
@Anthon innerHTMList kein DOM-Attribut. Als ich diese Frage 2011 beantwortete, funktionierte sie bei mir nicht. Es sieht so aus, als würden sie jetzt von einigen Browsern unterstützt. Wenn es für Sie funktioniert, ist die Verwendung innerHTMLsauberer. Es gibt jedoch keine Garantie dafür, dass es in allen Browsern funktioniert.
Nilesh
2
Anscheinend ist dies die einzige Möglichkeit, innerHTML zu erhalten, während RemoteWebDriver
Illidan am
73

Sicher können wir den gesamten HTML-Quellcode mit diesem Skript in Selenium Python erhalten:

elem = driver.find_element_by_xpath("//*")
source_code = elem.get_attribute("outerHTML")

Wenn Sie es in einer Datei speichern möchten:

with open('c:/html_source_code.html', 'w') as f:
    f.write(source_code.encode('utf-8'))

Ich schlage vor, in einer Datei zu speichern, da der Quellcode sehr, sehr lang ist.

Kennzeichen
quelle
2
Kann ich eine Verzögerung einstellen und die neueste Quelle abrufen? Es werden dynamische Inhalte mit Javascript geladen.
CodeGuru
Funktioniert dies auch, wenn die Seite nicht vollständig geladen ist? Gibt es auch eine Möglichkeit, eine Verzögerung wie bei @FlyingAtom erwähnt einzustellen?
TheRookierLearner
13

In Ruby gibt es unter Verwendung von Selenium-Webdriver (2.32.1) eine page_sourceMethode, die die gesamte Seitenquelle enthält.

John Alberts
quelle
5

Die Verwendung der Attributmethode ist in der Tat einfacher und unkomplizierter.

Wenn Sie Ruby mit den Edelsteinen Selenium und PageObject verwenden, um die Klasse zu erhalten, die einem bestimmten Element zugeordnet ist, lautet die Linie element.attribute(Class).

Das gleiche Konzept gilt, wenn Sie andere Attribute an das Element binden möchten. Zum Beispiel, wenn ich den String eines Elements haben wollte , element.attribute(String).

Tiffany G.
quelle
4

Sieht veraltet aus, aber lass es trotzdem hier sein. Der richtige Weg, um es in Ihrem Fall zu tun:

elem = wd.find_element_by_css_selector('#my-id')
html = wd.execute_script("return arguments[0].innerHTML;", elem)

oder

html = elem.get_attribute('innerHTML')

Beide arbeiten für mich (Selen-Server-Standalone-2.35.0)

nefski
quelle
3

Java mit Selenium 2.53.0

driver.getPageSource();
WltrRpo
quelle
das ist nicht, was die Frage gestellt hat
Corey Goldberg
Abhängig vom Web-Treiber gibt die getPageSourceMethode möglicherweise nicht die tatsächliche Seitenquelle zurück (dh mit möglichen Änderungen an Javascript). Die zurückgegebene Quelle kann die vom Server gesendete Rohquelle sein. Das Webdriver-Dokument muss überprüft werden, um diesen Punkt sicherzustellen.
Stephan
2

Ich hoffe, dies könnte helfen: http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html

Hier wird die Java-Methode beschrieben:

java.lang.String    getText() 

Leider ist es in Python nicht verfügbar. Sie können also die Methodennamen von Java nach Python übersetzen und mit den vorliegenden Methoden eine andere Logik ausprobieren, ohne die gesamte Seitenquelle abzurufen ...

Z.B

 my_id = elem[0].get_attribute('my-id')
oleksii.burdin
quelle
6
Python hat tatsächlich ein "gettext" -Äquivalent (ich denke, es ist nur das "text" -Attribut?), Aber das gibt tatsächlich nur den "Klartext" zwischen HTML-Tags zurück und gibt nicht die vollständige HTML-Quelle zurück.
Chris W.
2
Dies gibt auch nur den einfachen Text (nicht den HTML-Code) in Java zurück.
Ryan Shillington
Sie müssen darauf verweisen, wie Sie elem [0] gesagt haben, sonst funktioniert es nicht
HelloW
2

Das funktioniert bei mir nahtlos.

element.get_attribute('innerHTML')
Jitendra Pisal
quelle
1

InnerHTML gibt das Element innerhalb des ausgewählten Elements zurück und OuterHTML gibt zusammen mit dem von Ihnen ausgewählten Element innerhalb von HTML zurück

Beispiel: - Angenommen, Ihr Element ist wie folgt

<tr id="myRow"><td>A</td><td>B</td></tr>

innerHTML-Element Ausgabe

<td>A</td><td>B</td>

OuterHTML-Element Ausgabe

<tr id="myRow"><td>A</td><td>B</td></tr>

Live-Beispiel: -

http://www.java2s.com/Tutorials/JavascriptDemo/f/find_out_the_difference_between_innerhtml_and_outerhtml_in_javascript_example.htm

Nachfolgend finden Sie die Syntax, die je nach Bindung erforderlich ist. Ändern Sie das innerHTMLauf outerHTMLnach Bedarf.

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

Wenn Sie HTML für ganze Seiten möchten, verwenden Sie den folgenden Code: -

driver.getPageSource();
Shubham Jain
quelle
0
WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return      arguments[0].innerHTML;", element); 

Dieser Code funktioniert wirklich, um auch JavaScript aus dem Quellcode zu erhalten!

Ilya
quelle
0

Und im PHPUnit-Selentest ist es so:

$text = $this->byCssSelector('.some-class-nmae')->attribute('innerHTML');
Zorgijs
quelle
0

Wenn Sie an einer Lösung für die Fernsteuerung in Python interessiert sind, erhalten Sie folgende Informationen zu innerHTML:

innerHTML = sel.get_eval("window.document.getElementById('prodid').innerHTML")
StanleyD
quelle
Danke für die Hilfe, ich habe diese genutzt. Ich finde auch innerHTML = {solenium selector code}.textWerke trotzdem.
Shane
0

Die von mir bevorzugte Methode zum Abrufen des gerenderten HTML lautet wie folgt:

driver.get("http://www.google.com")
body_html = driver.find_element_by_xpath("/html/body")
print body_html.text

Die obige Methode entfernt jedoch alle Tags (ja auch die verschachtelten Tags) und gibt nur Textinhalt zurück. Wenn Sie auch das HTML-Markup erhalten möchten, verwenden Sie die folgende Methode.

print body_html.getAttribute("innerHTML")
rostig
quelle
1
Sie können auch driver.find_element_by_tag ("body") verwenden, um den Body-Inhalt der Seite zu erreichen.
Rusty