web-dev-qa-db-fra.com

Webdriver Selenium: Comment trouver TOUS les attributs d'un élément?

Dans le module Python Selenium, une fois que j'ai un objet WebElement, je peux obtenir la valeur de n'importe lequel de ses attributs avec get_attribute():

foo = elem.get_attribute('href')

Si l'attribut nommé 'href' N'existe pas, None est renvoyé.

Ma question est, comment puis-je obtenir une liste de tous les attributs d'un élément? Il ne semble pas y avoir de méthode get_attributes() ou get_attribute_names().

J'utilise la version 2.44.0 du module Selenium pour Python.

32
Al Sweigart

Il est impossible d'utiliser une API de sélecteur Web Selenium, mais vous pouvez exécuter un code javascript pour obtenir tous les attributs :

driver.execute_script('var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;', element)

Démo:

>>> from Selenium import webdriver
>>> from pprint import pprint
>>> driver = webdriver.Firefox()
>>> driver.get('https://stackoverflow.com')
>>> 
>>> element = driver.find_element_by_xpath('//div[@class="network-items"]/a')
>>> attrs = driver.execute_script('var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;', element)
>>> pprint(attrs)
{u'class': u'topbar-icon icon-site-switcher yes-hover js-site-switcher-button js-gps-track',
 u'data-gps-track': u'site_switcher.show',
 u'href': u'//stackexchange.com',
 u'title': u'A list of all 132 Stack Exchange sites'}

Par souci d'exhaustivité, une autre solution serait d'obtenir le outerHTML de la balise et d'analyser les attributs à l'aide d'un analyseur HTML. Exemple (en utilisant BeautifulSoup ):

>>> from bs4 import BeautifulSoup
>>> html = element.get_attribute('outerHTML')
>>> attrs = BeautifulSoup(html, 'html.parser').a.attrs
>>> pprint(attrs)
{u'class': [u'topbar-icon',
            u'icon-site-switcher',
            u'yes-hover',
            u'js-site-switcher-button',
            u'js-gps-track'],
 u'data-gps-track': u'site_switcher.show',
 u'href': u'//stackexchange.com',
 u'title': u'A list of all 132 Stack Exchange sites'}
49
alecxe

Ce qui suit obtient pour moi une liste de tous les attributs et leurs valeurs (parfois traduites en chaînes), en utilisant le pilote PhantomJS ou Chrome au moins:

elem.get_property('attributes')[0]

Pour obtenir simplement les noms:

x.get_property('attributes')[0].keys()
15
joeln

Voici ma tentative de réponse. Je ne l'ai testé que sur le champ de recherche de la page d'accueil de Google. J'ai utilisé la réponse de @ alecxe ci-dessus à propos de 'externalHTML' Après avoir obtenu le html, j'ai utilisé une expression régulière ([a-z]+-?[a-z]+_?)='?"? pour faire correspondre les noms d'attribut. Je pense que l'expression régulière devrait simplement être modifiée pour correspondre à un nombre croissant de cas. Mais le nom essentiel dont nous avons besoin est "tout ce qui se cache derrière le signe égal".

Étant donné un élément WebElement

def get_web_element_attribute_names(web_element):
    """Get all attribute names of a web element"""
    # get element html
    html = web_element.get_attribute("outerHTML")
    # find all with regex
    pattern = """([a-z]+-?[a-z]+_?)='?"?"""
    return re.findall(pattern, html)

Testez-le sur le code ci-dessous

import re
from Selenium import webdriver

driver = webdriver.Firefox()
google = driver.get("http://www.google.com")

driver.find_element_by_link_text("English").click()
search_element = driver.find_element_by_name("q")
get_web_element_attribute_names(search_element)

sortie:

['class', 'id', 'maxlength', 'name', 'autocomplete', 'title', 'value', 'aria-label', 'aria-haspopup', 'role', 'aria-autocomplete', 'style', 'dir', 'spellcheck', 'type']
2
chidimo

Vous pouvez trouver en utilisant la méthode element.get_property ().

from Selenium import webdriver
from Selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.ultimateqa.com/complicated-page/")

logo = driver.find_element(By.XPATH, "//img[@id='logo']")
attrs=[]
for attr in logo.get_property('attributes'):
    attrs.append([attr['name'], attr['value']])
print(attrs)

Sortie:

[['src', 'https://www.ultimateqa.com/wp-content/uploads/2019/01/horizontal_on_transparent_by_logaster-2.png'], ['alt', 'Ultimate QA'], ['id', 'logo'], ['data-height-percentage', '100'], ['data-actual-width', '912'], ['data-actual-height', '410']]
1
Ararat Avagyan