web-dev-qa-db-fra.com

Selenium Webdriver recherche un élément dans un sous-élément

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?

49
Dominic Larkin

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 
88
p0deje

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.

1
user3487861

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')
0
Harvey