Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selenium webdriver: How do I find ALL of an element's attributes?

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.

like image 265
Al Sweigart Avatar asked Dec 05 '14 01:12

Al Sweigart


People also ask

How do you find the properties of an element in Selenium?

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.

How do I find HTML elements in Selenium?

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.

Which Webdriver method is used to fetch the attribute value from the element?

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.


2 Answers

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'} 
like image 58
alecxe Avatar answered Sep 25 '22 22:09

alecxe


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() 
like image 23
joeln Avatar answered Sep 23 '22 22:09

joeln