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.
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'}
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()
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']
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']]