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


476

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 ceci:

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 existe-t-il de toute façon pour obtenir la "source de l'élément"?

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

Les documents de sélecteur Web sélénium pour Python sont fondamentalement inexistants et je ne vois rien dans le code qui semble activer cette fonctionnalité.

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


8
Vous pouvez également analyser tout wd.page_sourceavec beautifulsoup
eLRuLL

Réponses:


748

Vous pouvez lire l' innerHTMLattribut pour obtenir la source du contenu de l'élément ou outerHTMLpour 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.


9
innerHTML n'est pas un attribut DOM. La réponse ci-dessus ne fonctionnerait donc pas. innerHTML est une valeur javascript javascript. Faire ci-dessus retournerait null. La réponse de Nilesh est la bonne réponse.
bibstha

6
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.
Ryan Shillington

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

3
+1 Cela semble également fonctionner en rubis. J'ai le sentiment que la getAttributeméthode (ou l'équivalent dans d'autres langues) appelle simplement la méthode js dont le nom est l'arg. Cependant, la documentation ne le dit pas explicitement, donc la solution de nilesh devrait être une solution de rechange.
Kelvin

23
Cela échoue pour HtmlUnitDriver. Travaille pour ChromeDriver, FirefoxDriver, InternetExplorerDriver(IE10) et PhantomJSDriver(je ne l' ai pas testé d' autres).
acdcjunior

91

Il n'y a pas vraiment de moyen simple d'obtenir le code source html d'un fichier webelement. Vous devrez utiliser JS. Je ne suis pas trop sûr des liaisons python mais vous pouvez facilement faire ça en Java. Je suis sûr qu'il doit y avoir quelque chose de similaire à la JavascriptExecutorclasse en Python.

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

1
C'est essentiellement ce que j'ai fini par faire, bien qu'avec l'équivalent Python.
Chris W.

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

1
Pas besoin d'appeler javascript du tout. En Python, utilisez simplement element.get_attribute ('innerHTML')
Anthon

6
@Anthon innerHTMLn'est pas un attribut DOM. Lorsque j'ai répondu à cette question en 2011, cela n'a pas fonctionné pour moi, semble maintenant que certains navigateurs le prennent en charge. Si cela fonctionne pour vous, l'utilisation innerHTMLest plus propre. Cependant, il n'y a aucune garantie que cela fonctionnera sur tous les navigateurs.
nilesh

2
Apparemment, c'est le seul moyen d'obtenir innerHTML lors de l'utilisation de RemoteWebDriver
Illidan

73

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 souhaitez 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 d'enregistrer dans un fichier car le code source est très très long.


2
Puis-je définir un délai et obtenir la dernière source? Des contenus dynamiques sont chargés à l'aide de javascript.
CodeGuru

Est-ce que cela fonctionne même si la page n'est pas entièrement chargée? De plus, existe-t-il un moyen de définir un délai comme @FlyingAtom mentionné?
TheRookierLearner

13

Dans Ruby, à l'aide de selenium-webdriver (2.32.1), il existe une page_sourceméthode qui contient la source de la page entière.


5

L'utilisation de la méthode d'attribut est en fait plus simple et plus simple.

En utilisant Ruby avec les gemmes Selenium et PageObject, pour obtenir la classe associée à un certain élément, la ligne le 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).


4

Semble obsolète, mais que ce soit ici quand même. La façon correcte 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 fonctionnent pour moi (selenium-server-standalone-2.35.0)


3

Java avec Selenium 2.53.0

driver.getPageSource();

ce n'est pas ce que la question demandait
Corey Goldberg

Selon le pilote Web, la getPageSourceméthode peut ne pas retourner la source de la page réelle (c'est-à-dire avec d'éventuels changements javascript). La source retournée peut être la source brute envoyée par le serveur. Le document webdriver doit être vérifié pour garantir ce point.
Stephan

2

J'espère que cela pourrait aider: http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html

Voici la méthode Java décrite:

java.lang.String    getText() 

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

Par exemple

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

6
Python a en fait un équivalent "gettext" (je pense que c'est juste l'attribut "text"?) Mais cela retourne juste le "texte en clair" entre les balises HTML et ne retournera pas réellement la source HTML complète.
Chris W.

2
Cela renvoie uniquement le texte brut (pas le html) en Java.
Ryan Shillington

vous devez le référencer comme vous l'avez dit elem [0] sinon cela ne fonctionne pas
HelloW


1

InnerHTML retournera l'élément à l'intérieur de l'élément sélectionné et externalHTML retournera à l'intérieur du HTML avec l'élément que vous avez sélectionné

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

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

Élément innerHTML Sortie

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

Élément externeHTML Sortie

<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_innerhtml_and_outerhtml_in_javascript_example.htm

Vous trouverez ci-dessous la syntaxe qui nécessite selon une liaison différente. Modifiez le innerHTMLà outerHTMLselon les besoins.

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

Si vous voulez utiliser le code HTML de la page entière ci-dessous: -

driver.getPageSource();

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

Ce code fonctionne vraiment aussi pour obtenir du code source depuis JavaScript!


0

Et dans le test PHPUnit sélénium, c'est comme ceci:

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

0

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")

Merci pour l'aide, je l'ai utilisé. Je trouve aussi des innerHTML = {solenium selector code}.textœuvres tout de même.
Shane

0

La méthode pour obtenir le HTML rendu 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")

1
Vous pouvez également utiliser driver.find_element_by_tag ("body") pour atteindre le contenu du corps de la page.
Rusty
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.