web-dev-qa-db-fra.com

Obtenir le code source HTML de WebElement dans Selenium WebDriver à l'aide de Python

J'utilise les liaisons Python pour exécuter Selenium WebDriver.

from Selenium import webdriver
wd = webdriver.Firefox()

Je sais que je peux attraper un webelement comme si ...

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

Et je sais que je peux obtenir la source de la page complète avec ...

wd.page_source

Mais y a-t-il un moyen d'obtenir la "source de l'élément"?

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

Les documents Web Seliver de Selenium pour Python sont pratiquement inexistants et je ne vois rien dans le code qui semble activer cette fonctionnalité.

Avez-vous des idées sur la meilleure façon d'accéder au code HTML d'un élément (et de ses enfants)?

414
Chris W.

Vous pouvez lire l'attribut innerHTML pour obtenir la source du conten de l'élément ou outerHTML pour la source avec l'élément actuel.

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

C #:

element.GetAttribute("innerHTML");

Rubis:

element.attribute("innerHTML")

JS:

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

Testé et fonctionne avec le ChromeDriver.

654
Nerijus

Il n’existe pas vraiment de solution simple pour obtenir le code source HTML d’un élément Web. Vous devrez utiliser JS. Je ne suis pas très sûr des liaisons python, mais vous pouvez facilement le faire en Java. Je suis sûr qu'il doit y avoir quelque chose de similaire à JavascriptExecutor class en Python.

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

Bien sûr, nous pouvons obtenir tout le code source HTML avec ce script ci-dessous dans Selenium Python:

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

Si vous vous voulez l'enregistrer dans un fichier:

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

Je suggère de sauvegarder dans un fichier parce que le code source est très très long.

64
Mark

En Ruby, en utilisant Selenium-webdriver (2.32.1), il existe une méthode page_source qui contient la source de page entière.

12
John Alberts

L'utilisation de la méthode des attributs est en fait plus simple et plus simple.

En utilisant Ruby avec les gems Selenium et PageObject, pour obtenir la classe associée à un certain élément, la ligne serait element.attribute(Class).

Le même concept s'applique si vous souhaitez obtenir d'autres attributs liés à l'élément. Par exemple, si je voulais la chaîne d'un élément, element.attribute(String).

5
Tiffany G

Ça a l'air démodé, mais laissons-le quand même. La bonne façon de le faire dans votre cas:

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

ou

html = elem.get_attribute('innerHTML')

Les deux travaillent pour moi (Selenium-server-standalone-2.35.0)

4
nefski

J'espère que cela pourra aider: http://Selenium.googlecode.com/svn/trunk/docs/api/Java/org/openqa/Selenium/WebElement.html

Voici la méthode décrite par Java:

Java.lang.String    getText() 

Mais malheureusement, ce n'est pas disponible en Python. Ainsi, vous pouvez traduire les noms de méthodes en Python à partir de Java et essayer une autre logique en utilisant les méthodes actuelles sans obtenir la source de la page entière ...

Par exemple.

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

Java avec Selenium 2.53.0

driver.getPageSource();
2
WltrRpo

InnerHTML renverra l'élément dans l'élément sélectionné et outerHTML, dans HTML, avec l'élément sélectionné

Exemple: - Supposons maintenant que votre élément est comme ci-dessous

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

elément innerHTML

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

sortie outerHTML element

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

Exemple en direct: -

http://www.Java2s.com/Tutorials/JavascriptDemo/f/find_out_the_difference_between_innerhtinner_andhouter_ml_in_javascript_example.htm

Vous trouverez ci-dessous la syntaxe qui nécessite différentes liaisons. Remplacez innerHTML par outerHTML selon les besoins.

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

Si vous voulez utiliser une page HTML entière sous le code: -

driver.getPageSource();
1
Shubham Jain

Si vous êtes intéressé par une solution de contrôle à distance en Python, voici comment obtenir 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); 

Ce code fonctionne vraiment pour obtenir du code JavaScript aussi!

0
Ilya

La méthode pour obtenir le rendu HTML que je préfère est la suivante:

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

Cependant, la méthode ci-dessus supprime toutes les balises (oui, les balises imbriquées également) et renvoie uniquement le contenu texte. Si vous souhaitez également obtenir le balisage HTML, utilisez la méthode ci-dessous.

print body_html.getAttribute("innerHTML")
0
Rusty

Et dans PHPUnit Selenium, le test est le suivant:

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