Encontrar elementos por nombre de clase con Selenium en Python

4 minutos de lectura

Avatar de usuario de Sree
Sree

¿Cómo puedo filtrar elementos que tienen la misma clase?

<html>
  <body>
    <p class="content">Link1.</p>
  </body>
</html>
<html>
  <body>
    <p class="content">Link2.</p>
  </body>
</html>

Avatar de usuario de LittlePanda
Pequeño panda

Puede intentar obtener la lista de todos los elementos con class = "content" mediante el uso buscar_elementos_por_nombre_de_clase:

a = driver.find_elements_by_class_name("content")

A continuación, puede hacer clic en el enlace que está buscando.

  • ¿Devuelve todos los elementos de la clase o el primero encontrado?

    – Keerthan Kumar

    14 de mayo de 2018 a las 1:50

  • ¿Por qué estás incluso inicializando? a como una lista vacía si la reasignas inmediatamente?

    – usuario124384

    08/09/2018 a las 23:07

  • @keerthankumar esta lista de retorno de todos los elementos. Para obtener el primer uso find_element_by_class_name

    – zvi

    8 de agosto de 2019 a las 7:10

  • No necesita el punto y coma al final de la línea de código de Python.

    – campana de silo crudo

    9 de julio de 2020 a las 0:02

  • find_element_by_* y find_elements_by_* se eliminan en Selenium 4.3.0. Usar find_element en cambio. Mira todos los registros de cambios aquí.

    – Parampreet Rai

    8 de julio a las 17:08

Avatar de usuario de ZygD
ZygD

Por.CLASS_NAME aún no se menciona:

from selenium.webdriver.common.by import By

driver.find_element(By.CLASS_NAME, "content")

Esta es la lista de atributos. que se pueden utilizar como localizadores en Por:

CLASS_NAME
CSS_SELECTOR
ID
LINK_TEXT
NAME
PARTIAL_LINK_TEXT
TAG_NAME
XPATH

  • Gracias esto funcionó para mí. La alternativa de usar find_element_by_class_name no funcionaría en absoluto para mí, incluso si usara una espera.

    – sean le roy

    22 de julio a las 15:54

  • Pero arroja una excepción si no existe (?). Por lo tanto, interrumpir la ejecución de la prueba.

    -Peter Mortensen

    hace 18 horas

avatar de usuario de Selenium no detectado
selenio no detectado

Según el HTML:

<html>
    <body>
    <p class="content">Link1.</p>
    </body>
<html>
<html>
    <body>
    <p class="content">Link2.</p>
    </body>
<html>

dos (2) <p> los elementos tienen la misma clase content.

Entonces, para filtrar los elementos que tienen la misma clase, es decir content y crear un lista puede utilizar cualquiera de las siguientes estrategias de localización:

  • Usando class_name:

    elements = driver.find_elements_by_class_name("content")
    
  • Usando css_selector:

     elements = driver.find_elements_by_css_selector(".content")
    
  • Usando xpath:

    elements = driver.find_elements_by_xpath("//*[@class="content"]")
    

Idealmente, para hacer clic en el elemento que necesita para inducir WebDriverWait para el visibility_of_all_elements_located() y puedes usar cualquiera de los siguientes Estrategias de localización:

  • Usando CLASS_NAME:

    elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CLASS_NAME, "content")))
    
  • Usando CSS_SELECTOR:

    elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".content")))
    
  • Usando XPATH:

    elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//*[@class="content"]")))
    
  • Nota : Tienes que agregar las siguientes importaciones:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Referencias

Puede encontrar un par de discusiones relevantes en:

  • Cómo identificar un elemento a través del nombre de clase aunque haya varios elementos con los mismos nombres de clase usando Selenium y Python
  • No se puede ubicar el elemento usando className en Selenium y Java
  • ¿Cuáles son las propiedades de find_element_by_class_name en selenium python?
  • Cómo ubicar el último elemento web usando el atributo de nombre de clase a través de Selenium y Python

  • Ni el nombre de la clase ni el selector css funcionaron, no tengo idea de por qué, pero xpath sí, muchas gracias por eso

    – Temporizador

    14 de enero de 2021 a las 10:01

  • De un comentario: find_element_by_* y find_elements_by_* se eliminan en Selenium 4.3.0. Usar find_element en cambio.”

    -Peter Mortensen

    hace 17 horas


Utilice nth-child, por ejemplo: http://www.w3schools.com/cssref/sel_nth-child.asp

driver.find_element(By.CSS_SELECTOR, 'p.content:nth-child(1)')

o http://www.w3schools.com/cssref/sel_firstchild.asp

driver.find_element(By.CSS_SELECTOR, 'p.content:first-child')

La forma más sencilla es utilizar find_element_by_class_name('class_name')

Avatar de usuario de Peter Mortensen
Pedro Mortensen

La primera respuesta ha quedado obsoleta y las otras respuestas solo devuelven un resultado. Esta es la respuesta correcta:

driver.find_elements(By.CLASS_NAME, "content")

¿Ha sido útil esta solución?