web-dev-qa-db-fra.com

Sélénium: itération à travers des groupes d'éléments

Je l'ai fait avec BeautifulSoup mais c'est un peu lourd, et j'essaie de savoir si je peux le faire directement avec Selenium.

Disons que j'ai le code HTML suivant, qui se répète plusieurs fois dans la source de la page avec des éléments identiques mais un contenu différent:

<div class="person">
    <div class="title">
        <a href="http://www.url.com/johnsmith/">John Smith</a>
    </div>
    <div class="company">
        <a href="http://www.url.com/company/">SalesForce</a>
    </div>
</div>

J'ai besoin de construire un dictionnaire où l'entrée pour chaque personne ressemble à:

dict = {'name' : 'John Smith', 'company' : 'SalesForce'}

Je peux facilement demander à Selenium de produire une liste du contenu de chaque élément de niveau supérieur en faisant:

driver.find_elements_by_class_name('person')

Mais je ne peux pas parcourir la liste car la méthode ci-dessus ne restreint pas la portée/source au contenu de cet élément.

Si j'essaie de faire quelque chose comme ça:

people = driver.find_elements_by_class_name('person')
for person in people:
    print person.find_element_by_xpath['//div[@class="title"]//a').text

Je reçois juste le même nom encore et encore.

Je dois faire ce groupe par groupe car dans mon cas, itérer sur toute la page et ajouter chaque balise individuellement ne fonctionnera pas (il y a un défilement infini, donc ce serait vraiment inefficace).

Est-ce que quelqu'un sait s'il est possible de le faire directement dans Selenium, et si oui, comment?

16
AutomaticStatic

Utilisez find_elements_by_class_name() pour obtenir tous les blocs et find_element_by_xpath() pour obtenir title et company pour chaque personne:

persons = []
for person in driver.find_elements_by_class_name('person'):
    title = person.find_element_by_xpath('.//div[@class="title"]/a').text
    company = person.find_element_by_xpath('.//div[@class="company"]/a').text

    persons.append({'title': title, 'company': company})
24
alecxe