Selenium webdriver: Как найти ВСЕ атрибуты элемента?

В модуле Python Selenium, когда у меня есть объект WebElement, я могу получить значение любого из его атрибутов с помощью get_attribute() :

 foo = elem.get_attribute('href') 

Если атрибут с именем «href» не существует, возвращается None.

Мой вопрос: как я могу получить список всех атрибутов, которые имеет элемент? Кажется, что не существуют get_attributes() или get_attribute_names() .

  • Не удается найти элемент в селене по имени, имени или ссылке или WebDriverWait (). Такое исключение ошибки не возникает каждый раз
  • Java FluentWait в Python
  • Управление ключами отправки + щелчок в Selenium с привязками Python
  • Отправить форму, которая динамически отображается с помощью Scrapy?
  • Скачать картинку с selenium python
  • Скриншот Webdriver
  • настройка предпочтений Chrome w / Selenium Webdriver в Python
  • Загрузка файла в указанное место с помощью Selenium и python
  • 3 Solutions collect form web for “Selenium webdriver: Как найти ВСЕ атрибуты элемента?”

    Это невозможно, используя API-интерфейс selenium webdriver, но вы можете выполнить код javascript, чтобы получить все атрибуты :

     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'} при >>> 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'} 

    Следующее получает список всех атрибутов и их (иногда переведенных в строки) значений для меня, используя, по крайней мере, драйвер PhantomJS или Chrome:

     elem.get_property('attributes')[0] 

    Чтобы просто получить имена:

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

    Вот моя попытка ответить. Я проверил его только в окне поиска на главной странице Google. Я использовал ответ @ alecxe выше о 'outerHTML'. Получив html, я использовал регулярное выражение ([az]+-?[az]+_?)='?"? Чтобы соответствовать именам атрибутов. регулярное выражение просто должно быть изменено, чтобы соответствовать все большему числу случаев. Но существенное имя, которое нам нужно, – «все, что стоит за знаком равенства».

    Учитывая веб-элемент

     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 = """([az]+-?[az]+_?)='?"?""" 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) 

    вывод:

     ['class', 'id', 'maxlength', 'name', 'autocomplete', 'title', 'value', 'aria-label', 'aria-haspopup', 'role', 'aria-autocomplete', 'style', 'dir', 'spellcheck', 'type'] 
    Python - лучший язык программирования в мире.