Obtenga la fuente HTML de WebElement en Selenium WebDriver usando Python

476

Estoy usando los enlaces de Python para ejecutar Selenium WebDriver:

from selenium import webdriver
wd = webdriver.Firefox()

Sé que puedo tomar un webelement así:

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

Y sé que puedo obtener la fuente de la página completa con ...

wd.page_source

Pero, ¿hay alguna forma de obtener la "fuente del elemento"?

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

Los documentos de selenium webdriver para Python son básicamente inexistentes y no veo nada en el código que parezca habilitar esa funcionalidad.

¿Alguna idea sobre la mejor manera de acceder al HTML de un elemento (y sus elementos secundarios)?

Chris W.
fuente
8
También podrías analizar todo wd.page_sourcecon beautifulsoup
eLRuLL

Respuestas:

748

Puede leer el innerHTMLatributo para obtener la fuente del contenido del elemento o outerHTMLpara la fuente con el elemento actual.

Pitón:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

C#:

element.GetAttribute("innerHTML");

Rubí:

element.attribute("innerHTML")

JS:

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

Probado y funciona con el ChromeDriver.

Nerijus
fuente
99
innerHTML no es un atributo DOM. Entonces la respuesta anterior no funcionaría. innerHTML es un valor javascript javascript. Hacer lo anterior devolvería nulo. La respuesta de nilesh es la respuesta correcta.
bibstha
66
Esto funciona muy bien para mí y es mucho más elegante que la respuesta aceptada. Estoy usando Selenium 2.24.1.
Ryan Shillington
22
Aunque innerHTML no es un atributo DOM, es compatible con todos los principales navegadores ( quirksmode.org/dom/w3c_html.html ). A mí también me funciona bien.
CuongHuyTo
3
+1 Esto parece funcionar también en rubí. Tengo la sensación de que el getAttributemétodo (o equivalente en otros idiomas) simplemente llama al método js cuyo nombre es el argumento. Sin embargo, la documentación no dice esto explícitamente, por lo que la solución de nilesh debería ser una alternativa.
Kelvin
23
Esto falla por HtmlUnitDriver. Trabaja para ChromeDriver, FirefoxDriver, InternetExplorerDriver(IE10) y PhantomJSDriver(no he probado otros).
acdcjunior
91

Realmente no hay una forma directa de obtener el código fuente html de a webelement. Tendrás que usar JS. No estoy muy seguro acerca de los enlaces de Python, pero puede hacerlo fácilmente en Java. Estoy seguro de que debe haber algo similar a la JavascriptExecutorclase en Python.

 WebElement element = driver.findElement(By.id("foo"));
 String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element); 
nilesh
fuente
1
Esto es esencialmente lo que terminé haciendo, aunque con el equivalente de Python.
Chris W.
8
Creo que la respuesta a continuación, usando element.getAttribute ("innerHTML") es mucho más fácil de leer. No entiendo por qué la gente lo rechaza.
Ryan Shillington
1
No es necesario llamar a JavaScript en absoluto. En Python solo use element.get_attribute ('innerHTML')
Anthon
66
@Anthon innerHTMLno es un atributo DOM. Cuando respondí esta pregunta en 2011, no funcionó para mí, parece que ahora algunos navegadores la admiten. Si funciona para usted, entonces usar innerHTMLes más limpio. Sin embargo, no hay garantía de que funcione en todos los navegadores.
nilesh
2
Aparentemente, esta es la única forma de obtener innerHTML mientras usa RemoteWebDriver
Illidan
73

Claro que podemos obtener todo el código fuente HTML con este script a continuación en Selenium Python:

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

Si desea guardarlo en un archivo:

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

Sugiero guardar en un archivo porque el código fuente es muy, muy largo.

marca
fuente
2
¿Puedo establecer un retraso y obtener la última fuente? Hay contenidos dinámicos cargados usando javascript.
CodeGuru
¿Funciona incluso si la página no está completamente cargada? Además, ¿hay alguna forma de establecer un retraso como se menciona en @FlyingAtom?
TheRookierLearner
13

En Ruby, usando selenium-webdriver (2.32.1), hay un page_sourcemétodo que contiene toda la fuente de la página.

John Alberts
fuente
5

Usar el método de atributo es, de hecho, más fácil y más directo.

Usando Ruby con las gemas Selenium y PageObject, para obtener la clase asociada con un determinado elemento, la línea sería element.attribute(Class).

El mismo concepto se aplica si desea obtener otros atributos vinculados al elemento. Por ejemplo, si quería la cadena de un elemento, element.attribute(String).

Tiffany G
fuente
4

Parece anticuado, pero que esté aquí de todos modos. La forma correcta de hacerlo en su 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')

Ambos están trabajando para mí (selenium-server-standalone-2.35.0)

nefski
fuente
3

Java con Selenium 2.53.0

driver.getPageSource();
WltrRpo
fuente
eso no es lo que la pregunta pedía
Corey Goldberg
Dependiendo del controlador web, el getPageSourcemétodo puede no devolver la fuente real de la página (es decir, con posibles cambios de JavaScript). La fuente devuelta puede ser la fuente sin formato enviada por el servidor. El documento webdriver debe verificarse para garantizar este punto.
Stephan
2

Espero que esto pueda ayudar: http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html

Aquí se describe el método Java:

java.lang.String    getText() 

Pero desafortunadamente no está disponible en Python. Por lo tanto, puede traducir los nombres de los métodos a Python desde Java y probar otra lógica utilizando los métodos actuales sin obtener toda la fuente de la página ...

P.ej

 my_id = elem[0].get_attribute('my-id')
oleksii.burdin
fuente
66
Python en realidad tiene un equivalente de "gettext" (¿creo que es solo el atributo "text"?) Pero en realidad solo devuelve el "texto sin formato" entre las etiquetas HTML y en realidad no devolverá la fuente HTML completa.
Chris W.
2
Esto devuelve solo el texto sin formato (no el html) en Java también.
Ryan Shillington
debes referenciarlo como dijiste elem [0] de lo contrario no funciona
HelloW
2

Esto funciona a la perfección para mí.

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

InnerHTML devolverá el elemento dentro del elemento seleccionado y externalHTML volverá dentro del HTML junto con el elemento que haya seleccionado

Ejemplo: - Ahora suponga que su Elemento es el siguiente

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

Salida del elemento innerHTML

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

Salida del elemento externalHTML

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

Ejemplo en vivo: -

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

A continuación encontrará la sintaxis que requiere según un enlace diferente. Cambiar el innerHTMLaouterHTML según lo requerido.

Pitón:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

Si desea HTML de página completa use el siguiente código: -

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

¡Este código también funciona para obtener JavaScript de la fuente!

Ilya
fuente
0

Y en la prueba de selenio de PHPUnit es así:

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

Si está interesado en una solución para el control remoto en Python, aquí le mostramos cómo obtener innerHTML:

innerHTML = sel.get_eval("window.document.getElementById('prodid').innerHTML")
StanleyD
fuente
Gracias por la ayuda, he usado esto. También me parece que innerHTML = {solenium selector code}.textfunciona igual.
Shane
0

El método para obtener el HTML renderizado que prefiero es el siguiente:

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

Sin embargo, el método anterior elimina todas las etiquetas (sí, también las etiquetas anidadas) y devuelve solo contenido de texto. Si también está interesado en obtener el marcado HTML, utilice el siguiente método.

print body_html.getAttribute("innerHTML")
Oxidado
fuente
1
También puede usar driver.find_element_by_tag ("body") para llegar al contenido del cuerpo de la página.
Oxidado