wake-up-neo.com

Holen Sie sich die HTML-Quelle von WebElement in Selenium WebDriver mit Python

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

from Selenium import webdriver
wd = webdriver.Firefox()

Ich weiß, dass ich so ein Webelement greifen kann ...

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

Und ich weiß, dass ich die vollständige Quellseite mit ... bekommen kann.

wd.page_source

Aber gibt es trotzdem die "Elementquelle" zu bekommen?

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

Die Selenium-Webtreiber-Dokumente für Python sind im Grunde genommen nicht vorhanden, und ich sehe im Code nichts, was diese Funktionalität zu ermöglichen scheint.

Überlegen Sie, wie Sie am besten auf den HTML-Code eines Elements (und seiner untergeordneten Elemente) zugreifen können?

414
Chris W.

Sie können das Attribut innerHTML lesen, um die Quelle des Inhalts des Elements abzurufen, oder outerHTML für die Quelle mit des aktuellen Elements.

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 funktioniert mit dem ChromeDriver.

654
Nerijus

Es gibt keine einfache Möglichkeit, den HTML-Quellcode eines Webelements abzurufen. Sie müssen JS verwenden. Ich bin mir nicht sicher, was python Bindungen angeht, aber Sie können dies in Java problemlos tun. Ich bin mir sicher, dass es in Python etwas Ähnliches wie die Klasse JavascriptExecutor geben muss.

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

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:

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

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

64
Mark

In Ruby gibt es mit Selenium-Webdriver (2.32.1) eine page_source -Methode, die die gesamte Seitenquelle enthält.

12
John Alberts

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 ermitteln, die einem bestimmten Element zugeordnet ist, lautet die Zeile element.attribute(Class).

Dasselbe Konzept gilt, wenn Sie andere Attribute an das Element binden möchten. Wenn ich zum Beispiel den String eines Elements haben möchte, element.attribute(String).

5
Tiffany G

Sieht veraltet aus, aber lass es trotzdem hier sein. Die richtige Vorgehensweise in Ihrem Fall:

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 (Selenium-Server-Standalone-2.35.0)

4
nefski

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 in Python von Java übersetzen und eine andere Logik mit den vorhandenen Methoden ausprobieren, ohne die gesamte Seitenquelle abzurufen ...

Z.B.

 my_id = elem[0].get_attribute('my-id')
2
oleksii.burdin

Java mit Selen 2.53.0

driver.getPageSource();
2
WltrRpo

InnerHTML gibt das Element innerhalb des ausgewählten Elements und OuterHTML das Element, das Sie ausgewählt haben, 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 unterschiedlich sein muss. Ändern Sie innerHTML nach Bedarf in outerHTML.

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

Wenn Sie ganzseitiges HTML wünschen, verwenden Sie den folgenden Code: -

driver.getPageSource();
1
Shubham Jain

Wenn Sie an einer Lösung für Remote Control in Python interessiert sind, finden Sie hier Informationen zu innerHTML:

innerHTML = sel.get_eval("window.document.getElementById('prodid').innerHTML")
0
StanleyD
WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return      arguments[0].innerHTML;", element); 

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

0
Ilya

Die Methode, um das von mir bevorzugte gerenderte HTML zu erhalten, ist folgende:

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 Textinhalte zurück. Wenn Sie auch das HTML-Markup erhalten möchten, verwenden Sie die folgende Methode.

print body_html.getAttribute("innerHTML")
0
Rusty

Und in PHPUnit Selenium Test ist es so:

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