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
Ссылки
Вы можете найти пару соответствующих обсуждений в:
- Как идентифицировать элемент через имя класса, даже если есть несколько элементов с одинаковыми именами классов, используя Selenium и Python
- Невозможно найти элемент с помощью className в Selenium и Java
- Каковы свойства find_element_by_class_name в selenium python?
- Как найти последний веб-элемент с помощью атрибута classname через Selenium и Python
Используйте 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)