Saltar al contenido

Selenium webdriver: ¿Cómo encuentro TODOS los elementos de un elemento? attributes?

Luego de mucho batallar ya dimos con la solución de este apuro que agunos usuarios de nuestro sitio web han tenido. Si tienes algún detalle que compartir no dudes en dejar tu información.

Solución:

Está imposible utilizando una API de controlador web de selenio, pero puede ejecutar un código javascript para obtener todo 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)

Manifestación:

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

En aras de la exhaustividad, una solución alternativa sería obtener la etiqueta outerHTML y analizar el attributes utilizando un analizador HTML. Ejemplo (usando 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'

A continuación se obtiene una lista de todos attributes y sus valores (a veces traducidos a cadenas) para mí, usando al menos el controlador PhantomJS o Chrome:

elem.get_property('attributes')[0]

Para obtener los nombres:

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

Puedes encontrar usando elemento.get_property() método.

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)

Producción:

[['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']]

Tienes la opción de añadir valor a nuestra información cooperando tu experiencia en las referencias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *