Selenium Поиск элементов по имени класса в python

Как я могу отфильтровать элементы, имеющие одинаковый класс?

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

7 ответов

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

a=[];
a = driver.find_elements_by_class_name("content");

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

Автор.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

Согласно 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
    

Ссылки

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

Используйте 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')

Самый простой способ - это использовать find_element_by_class_name('class_name')

Первый ответ устарел, а другие ответы возвращают только один результат. Это правильный ответ:

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

Вопрос был связан с «элементами» во множественном числе, большинство из них означает «элемент». Чтобы дождаться элемента, а затем перебрать каждый:

      selectableEls = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CLASS_NAME, "content")))
for el in selectableEls:
    print(el)
Другие вопросы по тегам