561 votes

Obtenir la source HTML d'un WebElement dans Selenium WebDriver en utilisant Python

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

from selenium import webdriver
wd = webdriver.Firefox()

Je sais que je peux saisir un élément web comme ça :

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

Et je sais que je peux obtenir la source de la page entière avec...

wd.page_source

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

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

La documentation de Selenium WebDriver pour Python est pratiquement inexistante et je ne vois rien dans le code qui semble permettre cette fonctionnalité.

Quelle est la meilleure façon d'accéder au HTML d'un élément (et de ses enfants) ?

11 votes

Vous pouvez aussi simplement analyser tous les wd.page_source avec belle-soupe

0 votes

Le sélénium a plus de facilités que la belle soupe.

876voto

Nerijus Points 950

Vous pouvez lire le innerHTML pour obtenir la source du contenu 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");

Ruby :

element.attribute("innerHTML")

JavaScript :

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

Il a été testé et a fonctionné avec le ChromeDriver .

12 votes

InnerHTML n'est pas un attribut DOM. La réponse ci-dessus ne fonctionnerait donc pas. innerHTML est une valeur javascript. La réponse ci-dessus renverrait null. La réponse de nilesh est la bonne réponse.

7 votes

Cela fonctionne très bien pour moi, et est beaucoup plus élégant que la réponse acceptée. J'utilise Selenium 2.24.1.

25 votes

Bien que innerHTML ne soit pas un attribut DOM, il est bien supporté par tous les principaux navigateurs ( quirksmode.org/dom/w3c_html.html ). Cela fonctionne aussi bien pour moi.

95voto

nilesh Points 3914

Il n'y a pas vraiment de moyen direct d'obtenir le code source HTML d'un fichier webelement . Vous devrez utiliser JavaScript. Je ne suis pas trop sûr des liens avec Python, mais vous pouvez facilement faire cela en Java. Je suis sûr qu'il doit y avoir quelque chose de similaire à JavascriptExecutor en Python.

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

1 votes

C'est essentiellement ce que j'ai fini par faire, mais avec l'équivalent en Python.

8 votes

Je pense que la réponse ci-dessous, utilisant element.getAttribute("innerHTML") est beaucoup plus facile à lire. Je ne comprends pas pourquoi les gens la rejettent.

1 votes

Il n'est pas du tout nécessaire d'appeler javascript. En Python, utilisez simplement element.get_attribute('innerHTML').

82voto

PhongPT Points 219

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 voulez l'enregistrer dans un fichier :

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

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

2 votes

Puis-je définir un délai et obtenir la dernière source ? Il existe des contenus dynamiques chargés à l'aide de javascript.

0 votes

Cela fonctionne-t-il même si la page n'est pas entièrement chargée ? En outre, existe-t-il un moyen de définir un délai comme @FlyingAtom l'a mentionné ?

0 votes

Si une page Web contient des contenus dynamiques, cela dépend du comportement de cette page, mais à 90 %, vous devez définir un délai avant de recevoir le HTML brut de cette page. Et le moyen le plus simple est time.sleep(x) # Where x is seconds pour régler le délai.

13voto

John Alberts Points 19

En Ruby, en utilisant selenium-webdriver (2.32.1), il y a une fonction page_source qui contient la source entière de la page.

6voto

Tiffany G Points 78

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

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X