2014-12-05 737 views
21

在Python硒模塊,一旦我有一個WebElement對象我可以get_attribute()得到它的任何屬性的值:Selenium webdriver:如何找到元素的所有屬性?

foo = elem.get_attribute('href') 

如果不存在名爲「href」屬性的屬性,則返回無。

我的問題是,我怎麼能得到一個元素的所有屬性的列表?似乎沒有get_attributes()get_attribute_names()方法。

回答

36

這是不可能使用硒webdriver的API,但你可以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) 

演示:

>>> 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'} 

爲了完整起見,另一種解決方案是獲取標籤的outerHTML並使用HTML解析器解析屬性。示例(使用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'} 
+0

知道爲什麼這是不包括在W3C規範?似乎目光短淺離開這http://www.w3.org/TR/webdriver/#get-element-attribute – raven 2015-12-04 06:53:47

+0

@raven不知道,可能它只是它沒有廣泛使用。更常見的用戶會希望得到一個屬性..良好的問題,但謝謝。 – alecxe 2015-12-04 13:25:08

+1

可選:lxml element.attrib返回一個包含所有屬性的很好用的字典。 – Sandeep 2016-07-08 13:50:35

3

下獲取所有屬性的列表和他們(有時翻譯成字符串)值對我來說,使用PhantomJS或Chrome驅動程序至少包括:

elem.get_property('attributes')[0] 

要剛剛拿到的名字:

x.get_property('attributes')[0].keys() 
1

這裏是我的上述問題的回答。我只在谷歌主頁的搜索框中進行了測試。我使用@ alecxe的關於'outerHTML'的回答在獲得了html之後,我使用了正則表達式([a-z]+-?[a-z]+_?)='?"?來匹配屬性名稱。我認爲正則表達式只需要修改以匹配越來越多的情況。但是我們需要的基本名字是「等號背後的東西」。

給出一個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) 

測試它下面的代碼

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) 

輸出:

相關問題