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)?
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
.
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);
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.
En Ruby, en utilisant Selenium-webdriver (2.32.1), il existe une méthode page_source
qui contient la source de page entière.
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)
.
Ç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)
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')
Java avec Selenium 2.53.0
driver.getPageSource();
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: -
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();
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")
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!
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")
Et dans PHPUnit Selenium, le test est le suivant:
$text = $this->byCssSelector('.some-class-nmae')->attribute('innerHTML');