Obtenga la fuente HTML de WebElement en Selenium WebDriver usando Python

Estoy usando los enlaces de Python para ejecutar Selenium WebDriver.

from selenium import webdriver wd = webdriver.Firefox() 

Sé que puedo agarrar un elemento web como 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 de elementos”?

 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 permitir esa funcionalidad.

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

Puede leer el atributo innerHTML para obtener la fuente del contenido del elemento o outerHTML para la fuente con el elemento actual.

Pitón:

 element.get_attribute('innerHTML') 

Java:

 elem.getAttribute("innerHTML"); 

DO#:

 element.GetAttribute("innerHTML"); 

Rubí:

 element.attribute("innerHTML") 

JS:

 element.getAttribute('innerHTML'); 

PHP:

 $elem.getAttribute('innerHTML'); 

Probado y funciona con el ChromeDriver .

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

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

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 quieres guardarlo en el archivo:

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

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

En Ruby, utilizando Selenium-webdriver (2.32.1), hay un método page_source que contiene la fuente de la página completa.

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

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

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

Parece anticuado, pero déjalo estar aquí de todos modos. La forma correcta de hacerlo en tu 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)

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 de Java:

 java.lang.String getText() 

Pero desafortunadamente no está disponible en Python. Así que puedes traducir los nombres de los métodos a Python desde Java y probar otra lógica usando los métodos actuales sin obtener la fuente de la página completa …

P.ej

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

Java con Selenium 2.53.0

 driver.getPageSource(); 

Y en PHPUnit selenium test es así:

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

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

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

InnerHTML devolverá un elemento dentro del elemento seleccionado y outerHTML devolverá dentro de HTML junto con el elemento que ha seleccionado

Ejemplo: – Ahora suponga que su Elemento está como abajo

 AB 

Elemento interiorHTML Salida

 AB 

Elemento exteriorHTML Salida

 AB 

Ejemplo 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 syntax que requiere según el enlace diferente. Cambie el innerHTML a outerHTML según sea necesario.

Pitón:

 element.get_attribute('innerHTML') 

Java:

 elem.getAttribute("innerHTML"); 

Si desea utilizar el código HTML de toda la página debajo del código:

 driver.getPageSource(); 

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 tags (también las tags anidadas) y devuelve solo el contenido de texto. Si también está interesado en obtener el formato HTML, utilice el método a continuación.

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

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