In the Python Selenium module, once I have a WebElement
object I can get the value of any of its attributes with get_attribute()
:
foo = elem.get_attribute('href')
If the attribute named 'href'
doesn't exist, None
is returned.
My question is, how can I get a list of all of the attributes that an element has? There doesn't seem to be a get_attributes()
or get_attribute_names()
method.
I'm using version 2.44.0 of the Selenium module for Python.
get_property method is used to get properties of an element, such as getting text_length property of anchor tag. This method will first try to return the value of a property with the given name. If a property with that name doesn't exist, it returns the value of the property with the same name.
There are 2 ways to get the HTML source of a web element using Selenium: Method #1 – Read the innerHTML attribute to get the source of the content of the element. innerHTML is a property of a DOM element whose value is the HTML that exists in between the opening tag and ending tag.
The getAttribute() method is declared in the WebElement interface, and it returns the value of the web element's attribute as a string. For attributes having boolean values, the getAttribute() method will return either true or null.
It is not possible using a selenium webdriver API, but you can execute a javascript code to get all attributes:
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)
Demo:
>>> 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'}
For completeness sake, an alternative solution would be to get the tag's outerHTML
and parse the attributes using an HTML parser. Example (using 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'}
The following gets a list of all attributes and their (sometimes translated to strings) values for me, using the PhantomJS or Chrome driver at least:
elem.get_property('attributes')[0]
To just get the names:
x.get_property('attributes')[0].keys()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With