673 Stimmen

HTML-Quelle von WebElement in Selenium WebDriver mit Python abrufen

Ich verwende die Python-Bindungen zum Ausführen von Selenium WebDriver:

from selenium import webdriver
wd = webdriver.Firefox()

Ich weiß, dass ich ein Webelement wie folgt greifen kann:

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

Und ich weiß, dass ich die volle Seitenquelle mit...

wd.page_source

Aber gibt es eine Möglichkeit, die "Elementquelle" zu erhalten?

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

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

Wie kann man am besten auf den HTML-Code eines Elements (und seiner Kinder) zugreifen?

12 Stimmen

Sie könnten auch einfach alle wd.page_source mit beautifulsoup

0 Stimmen

Selen hat mehr Möglichkeiten als eine schöne Suppe.

1027voto

Nerijus Punkte 9568

Sie können die innerHTML Attribut, um die Quelle der Inhalt des Elements oder outerHTML für die Quelle mit dem aktuellen Element.

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

C#:

element.GetAttribute("innerHTML");

Rubin:

element.attribute("innerHTML")

JavaScript:

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

Es wurde getestet und funktionierte mit dem ChromeDriver .

103voto

nilesh Punkte 13715

Es gibt keine einfache Möglichkeit, den HTML-Quellcode einer webelement . Sie werden JavaScript verwenden müssen. Ich bin mir nicht sicher, ob es Python-Bindungen gibt, aber man kann so etwas auch in Java machen. Ich bin mir sicher, dass es etwas Ähnliches gibt wie JavascriptExecutor Klasse in Python.

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

101voto

Mark Punkte 969

Sicher können wir alle HTML-Quellcode mit diesem Skript unten in Selenium Python zu bekommen:

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.

15voto

John Alberts Punkte 249

In Ruby, unter Verwendung von selenium-webdriver (2.32.1), gibt es eine page_source Methode, die den gesamten Seitenquelltext enthält.

11voto

undetected Selenium Punkte 147423

Die anderen Antworten enthalten viele Details zum Abrufen des Markups einer WebElement . Ein wichtiger Aspekt ist jedoch, dass moderne Websites zunehmend die JavaScript , ReactJS , jQuery , Ajax , Vue.js , Ember.js , GWT usw., um die dynamischen Elemente innerhalb der DOM-Baum . Daher muss gewartet werden, bis das Element und seine Kinder vollständig gerendert sind, bevor das Markup abgerufen werden kann.


Python

Daher müssen Sie idealerweise Folgendes veranlassen WebDriverWait für die visibility_of_element_located() und Sie können eine der folgenden Möglichkeiten nutzen Lokalisierungsstrategien :

  • Verwendung von get_attribute("outerHTML") :

    element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#my-id")))
    print(element.get_attribute("outerHTML"))
  • Verwendung von execute_script() :

    element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#my-id")))
    print(driver.execute_script("return arguments[0].outerHTML;", element))
  • Nota : Sie müssen die folgenden Importe hinzufügen:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X