Селен Поиск элементов по имени класса в Python

Как отфильтровать элементы одного класса?

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

person Sree    schedule 02.05.2015    source источник
comment
Вы уже пробовали что-нибудь (код)? Поскольку вы новичок, пожалуйста, прочтите нашу страницу с инструкциями и особенно Как задать хороший вопрос?.   -  person ZygD    schedule 02.05.2015
comment
Также ваш html-код плохо отформатирован. Вы не закрываете тег ‹html›.   -  person Eugene    schedule 02.05.2015
comment
Что вы собираетесь делать с выбранным элементом? Какие критерии вы надеетесь использовать? Что вы уже пробовали?   -  person Richard    schedule 03.05.2015


Ответы (5)


Вы можете попытаться получить список всех элементов с помощью class = "content", используя find_elements_by_class_name :

a = driver.find_elements_by_class_name("content")

Затем вы можете щелкнуть ссылку, которую ищете.

person LittlePanda    schedule 04.05.2015
comment
Возвращает ли он все элементы класса или первые найденные? - person keerthan kumar; 14.05.2018
comment
Почему вы даже инициализируете a как пустой список, если сразу переназначаете его? - person user124384; 09.09.2018
comment
@keerthankumar этот список возврата всех элементов. Чтобы получить 1-й, используйте find_element_by_class_name - person zvi; 08.08.2019
comment
Вам не нужна точка с запятой в конце строки кода Python. - person I'm Root James; 09.07.2020

Согласно HTML:

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

Два (2) <p> элемента имеют один и тот же класс content.

Итак, чтобы отфильтровать элементы, имеющие один и тот же класс, т.е. content, и создать список, вы можете использовать любой из следующих Стратегии поиска:

  • Использование class_name:

    elements = driver.find_elements_by_class_name("content")
    
  • Использование css_selector:

     elements = driver.find_elements_by_css_selector(".content")
    
  • Использование xpath:

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

В идеале, чтобы щелкнуть элемент, необходимо вызвать WebDriverWait для visibility_of_all_elements_located(), и вы можете использовать любую из следующих стратегий поиска:

  • Использование CLASS_NAME:

    elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CLASS_NAME, "content")))
    
  • Использование CSS_SELECTOR:

    elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".content")))
    
  • Использование XPATH:

    elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//*[@class='content']")))
    
  • Примечание. Вам необходимо добавить следующий импорт:

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

использованная литература

Вы можете найти пару соответствующих обсуждений в:

person DebanjanB    schedule 09.08.2020
comment
Ни имя класса, ни селектор css не работали, не знаю почему, но xpath работал, большое спасибо за это - person Timeler; 14.01.2021

Самый простой способ - использовать _1 _

person wanderlust    schedule 04.05.2015

Используйте nth-child, например: http://www.w3schools.com/cssref/sel_nth-child.asp

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

или http://www.w3schools.com/cssref/sel_firstchild.asp

driver.find_element(By.CSS_SELECTOR, 'p.content:first-child')
person Stan E    schedule 03.05.2015

Автор.CLASS_NAME еще не упоминается:

from selenium.webdriver.common.by import By

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

Это список атрибутов которые можно использовать в качестве локаторов в By:

CLASS_NAME
CSS_SELECTOR
ID
LINK_TEXT
NAME
PARTIAL_LINK_TEXT
TAG_NAME
XPATH

person ZygD    schedule 17.06.2020