Ottieni la fonte HTML di WebElement in Selenium WebDriver usando Python


476

Sto usando i collegamenti Python per eseguire Selenium WebDriver:

from selenium import webdriver
wd = webdriver.Firefox()

So di poter prendere un elemento web in questo modo:

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

E so di poter ottenere la fonte a pagina intera con ...

wd.page_source

Ma c'è un modo per ottenere la "fonte di elementi"?

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

I documenti del selenio webdriver per Python sono sostanzialmente inesistenti e non vedo nulla nel codice che sembra abilitare quella funzionalità.

Qualche idea sul modo migliore per accedere all'HTML di un elemento (e dei suoi figli)?


8
Puoi anche analizzare tutto wd.page_sourcecon beautifulsoup
eLRuLL

Risposte:


748

Puoi leggere l' innerHTMLattributo per ottenere l'origine del contenuto dell'elemento oouterHTML per l'origine con l'elemento corrente.

Pitone:

element.get_attribute('innerHTML')

Giava:

elem.getAttribute("innerHTML");

C #:

element.GetAttribute("innerHTML");

Rubino:

element.attribute("innerHTML")

JS:

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

Testato e funziona con il ChromeDriver.


9
innerHTML è un attributo non DOM. Quindi la risposta sopra non funzionerebbe. innerHTML è un valore javascript javascript. Fare sopra restituirebbe null. La risposta di nilesh è la risposta corretta.
bibstha,

6
Questo funziona alla grande per me ed è molto più elegante della risposta accettata. Sto usando il selenio 2.24.1.
Ryan Shillington,

22
Sebbene innerHTML non sia un attributo DOM, è ben supportato da tutti i principali browser ( quirksmode.org/dom/w3c_html.html ). Funziona bene anche per me.
CuongHuy, fino al

3
+1 Questo sembra funzionare anche in rubino. Ho la sensazione che il getAttributemetodo (o equivalente in altre lingue) chiama semplicemente il metodo js il cui nome è arg. Tuttavia la documentazione non dice esplicitamente questo, quindi la soluzione di nilesh dovrebbe essere un fallback.
Kelvin,

23
Questo fallisce per HtmlUnitDriver . Opere per ChromeDriver, FirefoxDriver, InternetExplorerDriver(IE10) e PhantomJSDriver(non ho ancora testato gli altri).
acdcjunior,

91

Non esiste davvero un modo semplice per ottenere il codice sorgente html di a webelement. Dovrai usare JS. Non sono troppo sicuro dei collegamenti a Python, ma puoi farlo facilmente in Java. Sono sicuro che ci deve essere qualcosa di simile alla JavascriptExecutorclasse in Python.

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

1
Questo è essenzialmente quello che ho finito per fare, anche se con l'equivalente di Python.
Chris W.

8
Penso che la risposta qui sotto, usando element.getAttribute ("innerHTML") sia molto più facile da leggere. Non capisco perché la gente lo stia votando.
Ryan Shillington,

1
Non è necessario chiamare javascript. In Python basta usare element.get_attribute ('innerHTML')
Anthon,

6
@Anthon innerHTMLnon è un attributo DOM. Quando ho risposto a questa domanda nel 2011, non ha funzionato per me, sembra che ora alcuni browser lo supportino. Se funziona per te, l'utilizzo innerHTMLè più pulito. Tuttavia, non vi è alcuna garanzia che funzionerà su tutti i browser.
nilesh,

2
Apparentemente, questo è l'unico modo per ottenere innerHTML durante l'utilizzo di RemoteWebDriver
Illidan,

73

Certo che possiamo ottenere tutto il codice sorgente HTML con questo script qui sotto in Selenium Python:

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

Se vuoi salvarlo su file:

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

Suggerisco di salvare su un file perché il codice sorgente è molto lungo.


2
Posso impostare un ritardo e ottenere l'ultima fonte? Ci sono contenuti dinamici caricati usando JavaScript.
CodeGuru,

Funziona anche se la pagina non è completamente caricata? Inoltre, c'è un modo per impostare un ritardo come citato da @FlyingAtom?
TheRookierLearner,

13

In Ruby, usando selenium-webdriver (2.32.1), esiste un page_sourcemetodo che contiene l'intera origine della pagina.


5

L'uso del metodo degli attributi è, infatti, più semplice e diretto.

Usando Ruby con le gemme Selenium e PageObject, per ottenere la classe associata a un certo elemento, la linea sarebbe element.attribute(Class).

Lo stesso concetto si applica se si desidera ottenere altri attributi legati all'elemento. Per esempio, se volevo la stringa di un elemento, element.attribute(String).


4

Sembra obsoleto, ma lascia che sia qui comunque. Il modo corretto di farlo nel tuo caso:

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

o

html = elem.get_attribute('innerHTML')

Entrambi funzionano per me (selenium-server-standalone-2.35.0)


3

Java con Selenium 2.53.0

driver.getPageSource();

non è quello che ha posto la domanda
Corey Goldberg,

A seconda del webdriver, il getPageSourcemetodo potrebbe non restituire l'origine pagina effettiva (ovvero con possibili modifiche javascript). La fonte restituita può essere la fonte non elaborata inviata dal server. Il documento webdriver deve essere verificato per garantire questo punto.
Stephan,

2

Spero che questo possa aiutare: http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html

Qui è descritto il metodo Java:

java.lang.String    getText() 

Ma sfortunatamente non è disponibile in Python. Quindi puoi tradurre i nomi dei metodi in Python da Java e provare un'altra logica usando i metodi attuali senza ottenere l'intera sorgente della pagina ...

Per esempio

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

6
Python in realtà ha un equivalente "gettext" (penso che sia solo l'attributo "testo"?) Ma che in realtà restituisce solo il "testo in chiaro" tra i tag HTML e non restituirà in realtà il codice HTML completo.
Chris W.

2
Ciò restituisce solo il testo semplice (non l'html) anche in Java.
Ryan Shillington,

devi fare riferimento come hai detto elem [0] altrimenti non funziona
Ciao,


1

InnerHTML restituirà l'elemento all'interno dell'elemento selezionato e outerHTML tornerà all'interno dell'HTML insieme all'elemento selezionato

Esempio: - Supponiamo ora che il tuo elemento sia come di seguito

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

Elemento innerHTML Output

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

Elemento outerHTML Output

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

Esempio live: -

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

Di seguito troverai la sintassi che richiede secondo il diverso binding. Modificare innerHTMLin outerHTMLcome richiesto.

Pitone:

element.get_attribute('innerHTML')

Giava:

elem.getAttribute("innerHTML");

Se vuoi HTML di tutta la pagina usa sotto il codice: -

driver.getPageSource();

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

Questo codice funziona davvero anche per ottenere JavaScript dalla fonte!


0

E nel test del selenio di PHPUnit è così:

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

0

Se sei interessato a una soluzione per il controllo remoto in Python, ecco come ottenere innerHTML:

innerHTML = sel.get_eval("window.document.getElementById('prodid').innerHTML")

Grazie per l'aiuto, l'ho usato. Trovo anche innerHTML = {solenium selector code}.textlavori uguali.
Shane,

0

Il metodo per ottenere il rendering HTML che preferisco è il seguente:

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

Tuttavia, il metodo sopra rimuove tutti i tag (sì anche i tag nidificati) e restituisce solo il contenuto del testo. Se sei interessato a ottenere anche il markup HTML, utilizza il metodo seguente.

print body_html.getAttribute("innerHTML")

1
Puoi anche usare driver.find_element_by_tag ("body") per raggiungere il contenuto del corpo della pagina.
Rusty,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.