Как найти элемент по названию класса в selenium c#?

Есть класс со следующим именем: "_postpost page_block post--withPostBottomAction post--with-likes deep_active". Как можно найти элементы с таким классом на странице, если выдается ошибка: Compound class names not allowed. Cannot have whitespace in class name. Все говорят использовать XPath. Есть ли решение без использования Xpath?

<div id="post-103083994_3958581" class="_post post page_block post--withPostBottomAction  post--with-likes deep_active" data-post-id="-103083994_3958581" onclick="wall.postClick('-103083994_3958581', event);" data-replies-limit="1" post_view_hash="c8430e7d826fa686cc">
  <div class="_post_content">

Ответы (2 шт):

Автор решения: Andrew

Селениум не работает с computed/Compound properties (в даном частном случае - "Compound class") - т.е. если в проперти class указано много классов через пробел.

Поэтому НЕ НУЖНО пытаться искать по всему полю указанному в классе. Нужно искать или ПО ОДНОМУ ИЗ УКАЗАННЫХ класcов (например только по post--withPostBottomAction или любому иному) или...

реализовать костыль который фиксит этот недостаток у селениума что бы он начал работать с computed properties.

driver.FindElement(By.Xpath(".//span[contains(@class,'list-item')] AND [contains(@class,'list-item-station')]"));

можно написать такую функцию которая генерит подобный икспас. Тогда сможешь искать что необходимо в том числе по computed properties.

Вся магия в автоматическом преобразовании строки с классом

_post post page_block post--withPostBottomAction post--with-likes deep_active

в строку

[contains(@class,'_post')] AND [contains(@class,'page_block')] AND [contains(@class,'post--withPostBottomAction')] AND [contains(@class,'post--with-likes')] AND [contains(@class,'deep_active')]

тогда сможешь использовать икспас и на Compound class-ах.

ничего сложного в этом нет.


Все говорят использовать XPath. Есть ли решение без использования Xpath?

Есть.

  • id
  • name
  • link_text
  • css selector

и др. способами которые можно указать в методе driver.FindElement(By.......)


Но вообще родным способом для селениума было бы просто указывать икспас через путь. Не обязательно полный. То есть что-то вроде:

.FindElement(By.XPath(".//div[@data-marker='items']/div/div/../span[@class='post--withPostBottomAction']")

Это правильный официально закрепленный способ использовать Xpath в селениуме.

→ Ссылка
Автор решения: Vadim

не надо изобретать велосипед, добавьте по By.CssSelector и вообще здесь очень подробно всё написано, чем Вы можете пользоваться https://selenium-python.readthedocs.io/locating-elements.html

→ Ссылка