J'essaie de rechercher un élément dans un sous-élément avec Selenium (Version 2.28.0), mais Selenium ne semble pas limiter sa recherche au sous-élément. Suis-je en train de mal faire ou existe-t-il un moyen d'utiliser element.find pour rechercher un sous-élément?
Pour un exemple, j'ai créé une page Web de test simple avec ce code:
<!DOCTYPE html>
<html>
<body>
<div class=div title=div1>
<h1>My First Heading</h1>
<p class='test'>My first paragraph.</p>
</div>
<div class=div title=div2>
<h1>My Second Heading</h1>
<p class='test'>My second paragraph.</p>
</div>
<div class=div title=div3>
<h1>My Third Heading</h1>
<p class='test'>My third paragraph.</p>
</div>
</body>
</html>
Mon code python (Version 2.6) ressemble à ceci:
from Selenium import webdriver
driver = webdriver.Firefox()
# Open the test page with this instance of Firefox
# element2 gets the second division as a web element
element2 = driver.find_element_by_xpath("//div[@title='div2']")
# Search second division for a paragraph with a class of 'test' and print the content
print element2.find_element_by_xpath("//p[@class='test']").text
# expected output: "My second paragraph."
# actual output: "My first paragraph."
Si je cours:
print element2.get_attribute('innerHTML')
Il renvoie le html de la deuxième division. Sélénium ne limite donc pas sa recherche à element2.
J'aimerais pouvoir trouver un sous-élément de element2. Ce message suggère que mon code devrait fonctionner Selenium WebDriver accède à un sous-élément mais son problème a été causé par un problème de délai d'attente.
Quelqu'un peut-il m'aider à comprendre ce qui se passe ici?
Lorsque vous démarrez votre expression XPath avec //
, il recherche à partir de la racine du document en ignorant votre élément parent. Vous devez ajouter une expression avec .
element2 = driver.find_element_by_xpath("//div[@title='div2']")
element2.find_element_by_xpath(".//p[@class='test']").text
Utilisez le suivant:
element2 = driver.find_element_by_cssselector("css=div[title='div2']")
element2.find_element_by_cssselector("p[@class='test']").text
Veuillez me faire savoir si vous avez des problèmes.
Voici comment vous recherchez un élément ou une balise dans la sous-classe CSS et je pense que cela fonctionne également pour les situations à plusieurs niveaux:
Exemple HTML:
<li class="meta-item">
<span class="label">Posted:</span>
<time class="value" datetime="2019-03-22T09:46:24+01:00" pubdate="pubdate">22.03.2019 u 09:46</time>
</li>
C'est ainsi que vous obtiendrez la valeur de balise pubdate
par exemple.
published = driver.find_element_by_css_selector('li>time').get_attribute('datetime')